我遇到了一个令我难以置信的问题。我注意到 IDataReader.Read() 的行为方式不同,具体取决于 IDbCommand.CommandText 的设置方式。
在下面的代码中 - 如果设置了"AID"并传递给EntAgencyId(),则读取器。Read() 返回 true,程序能够进入 while 循环。如果我只是使用传递给函数的相同值('455')在 EntAgencyId() 中设置"查询",则程序永远无法进入 while 循环(从 textbox.text 传入"AID"时会发生相同的行为)。
public string EntAgencyId(string AID)
{
cmd = uasConnection.CreateCommand();
//query = "select * from EnterpriseAgencyTbl where AOCId = " + AID; //<--Works
query = "select * from EnterpriseAgencyTbl where AOCId = 455"; //<--Causes issue
cmd.CommandText = query;
reader = cmd.ExecuteReader();
while (reader.Read())
{
EntAgId = reader["Id"].ToString();
AgencyName = reader["Name"].ToString();
}
reader.Close();
return AgencyName;
}
调试时,"query"始终具有相同的值,那么为什么这会与 .读取()。
发人深思的东西-。如果有更多的行,则 read() 返回 true;否则,为假。在这种情况下,我尝试使用 Item 属性和 GetValue() 读取第一行,两者都会导致"对象未设置为对象的实例"错误。
我已经完全没有想法了,所以任何帮助将不胜感激!
如果AID
可能来自不受信任的来源,那么您确实应该使用参数。
请改用以下代码:
query = "select * from EnterpriseAgencyTbl where AOCId = @AOCId";
cmd.CommandText = query;
cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = int.Parse(AID) });
然后查看使用静态输入是否表现相同,例如:
cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = 455 });
注意:我根据名称中的"Id"假设 AOCId 是 int 类型。