使用 IDataReader.Read() 时行为不一致

本文关键字:不一致 IDataReader Read 使用 | 更新日期: 2023-09-27 18:32:17

我遇到了一个令我难以置信的问题。我注意到 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() 读取第一行,两者都会导致"对象未设置为对象的实例"错误。

我已经完全没有想法了,所以任何帮助将不胜感激!

使用 IDataReader.Read() 时行为不一致

如果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 类型。