0

我遇到了一个令我难以置信的问题。我注意到 IDataReader.Read() 的行为不同,具体取决于 IDbCommand.CommandText 的设置方式。

在下面的代码中 - 如果设置了“AID”​​并将其传递给 EntAgencyId(),则 reader.Read() 返回 true,并且程序能够进入 while 循环。如果我只是在 EntAgencyId() 中使用我传递给函数的相同值 ('455') 设置“查询”,则程序永远无法进入 while 循环(从一个文本框.文本)。

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() 仅读取第一行,两者都会导致“对象未设置为对象的实例”错误。

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

4

1 回答 1

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 });

注意:我根据名称中的“Id”假设 AOCId 是 int 类型。

于 2012-04-25T14:29:45.160 回答