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

时间:2012-04-25 14:16:25

标签: c# idatareader

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

我完全没有想法,所以任何帮助都会受到赞赏!

1 个答案:

答案 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类型。