У меня есть запрос, который, в основном, говорит это:
SELECT DISTINCT [DB_ID]
FROM [TableX]
WHERE ([ForeignKey]=@ForeignKey);
Получив это, я возвращаю первый DB_ID (должен быть только один).
Процедура, которую я написал для вызова этого, написана на C #, чтобы я мог получить идентификатор базы данных для любого имени таблицы, независимо от того, как назван DB_ID.
Большинство параметров ForeignKey являются целыми числами, но некоторые являются строковыми значениями. Чтобы добавить значение параметра, я использую
Parameter.AddWithValue(ForeignKeyName, objValue);
Эта процедура прекрасно работает с существующими идентификаторами базы данных; однако, когда ForeignKey не найден, он возвращает 3 вместо нуля.
Я понимаю, что мог бы использовать метод грубой силы и просто написать два стиля операторов SQL (один для принятия целого числа, другой для принятия строки) и вообще избежать параметра, но я хочу знать и понимать, почему этот параметризованный рутина не работает.
Может кто-нибудь объяснить мне, почему это не работает?
/// <summary>
/// Locates the Primary Key Value for a Table using the Table's Foreign Key
/// </summary>
/// <param name="tableName">Name of the Table to Delete from</param>
/// <param name="primaryKey">Name of the Primary Key in the Table</param>
/// <param name="foreignKey">Name of the Foreign Key in the Table</param>
/// <param name="id">Foreign Key Value to Search for in the Table</param>
/// <returns>Primary Key Database ID for this Table Record</returns>
List<int> tableSelectId(string tableName, string primaryKey, string foreignKey, object id) {
string sqlText = string.Format("SELECT DISTINCT [{0}] " +
"FROM [{1}] WHERE ([{2}]=@id);", primaryKey, tableName, foreignKey);
DataTable table = new DataTable("IDs");
OleDbDataAdapter da = new OleDbDataAdapter(sqlText, AccessConnection);
da.SelectCommand.Parameters.AddWithValue("@id", id);
try {
da.Fill(table);
} catch (OleDbException err) {
clsLogger.LogException((Exception)err);
}
List<int> vals = new List<int>(table.Rows.Count);
foreach (DataRow row in table.Rows) {
vals.Add((int)row[0]);
}
return vals;
}
ВФ