我有一个查询基本上是这样说的:
SELECT DISTINCT [DB_ID]
FROM [TableX]
WHERE ([ForeignKey]=@ForeignKey);
一旦我有了这个,我就会返回第一个DB_ID(应该只有一个)。
我为调用它编写的例程是在C#中,这样我就可以获得任何表名的数据库ID,无论DB_ID是什么名称。
大多数ForeignKey参数都是Integers,但有些是String值。要添加参数值,我使用
Parameter.AddWithValue(ForeignKeyName, objValue);
此例程适用于现有数据库ID;但是,当找不到ForeignKey时,它返回3而不是null。
我意识到我可以使用强力技术并简单地编写两种样式的SQL语句(一种接受一个Integer,另一种接受一个String)并完全避免参数,但我想知道并理解为什么这个参数化例程不起作用。
有人可以向我解释为什么这不起作用吗?
/// <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;
}
EOF
答案 0 :(得分:1)
重新审视:结果发现另一个开发人员正在处理同一个项目,并且他已经复制了一个不同的数据库来处理有一个空表。
该表有一小时的记录,下一个小时没有记录!
简而言之,上面的代码段有效。