我遇到了令我难以置信的问题。我注意到IDataReader.Read()的行为有所不同,具体取决于IDbCommand.CommandText的设置方式。
在下面的代码中 - 如果设置'AID'并传递给EntAgencyId(),则reader.Read()返回true,程序可以进入while循环。如果我只是使用我传递给函数('455')的相同值在EntAgencyId()中设置'query',那么程序永远不能进入while循环(从'AID'传入'AID'时会发生相同的行为一个textbox.text)。
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()产生影响。
思考的食物 - .Read()如果有更多行则返回true;否则,错误。在这种情况下,我尝试使用Item属性和GetValue()读取第一行,两者都导致“对象未设置为对象的实例”错误。
我完全没有想法,所以任何帮助都会受到赞赏!
答案 0 :(得分:2)
如果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 });
注意:我根据&#39; Id&#39;做出假设。在名称中,AOCId是一个int类型。