DataReader IndexOutofRangeException未被用户代码处理

时间:2014-03-04 12:46:47

标签: c# asp.net sqldatareader datareader

我又遇到了另一个问题。我试图使用DataReader从数据库中获取数据但我在测试代码时遇到了错误。谁能帮我吗?错误发生在这一行:

chkAssess = readAssess [columnName] .ToString();

以下是代码段:

public string CheckAssess(string emailAddress, string columnName)
{
    string chkAssess = "";
    SqlDataReader readAssess;
    //readAssess = new SqlDataReader();

    string MgrAssessQry = "SELECT '"+columnName+"' FROM tblAllUsers";
    //MgrAssessQry += " WHERE email ='" + emailAddress + "'";

    SqlCommand cmdReadAssess = new SqlCommand(MgrAssessQry, cn);
    cn.Open();
    readAssess = cmdReadAssess.ExecuteReader();

    while(readAssess.Read())
    {
        // Add the rows
        chkAssess = readAssess[columnName].ToString();         
    }

    return chkAssess;
}

4 个答案:

答案 0 :(得分:2)

尝试使用不带''

的列名
select something from table 

而不是

select 'something' from table
  1. 出于安全原因,不要以这种方式创建sql查询(通过连接字符串) - 使用@parameters而不是
  2. <强> 2。最后关闭读者

答案 1 :(得分:2)

试试这个:

public string CheckAssess(string emailAddress, string columnName)
{
string chkAssess = "";
SqlDataReader readAssess;
//readAssess = new SqlDataReader();

string MgrAssessQry = "SELECT @Column_Name FROM tblAllUsers";

SqlCommand cmdReadAssess = new SqlCommand(MgrAssessQry, cn);
cmdReadAssess.Parameters.AddWithValue(new SqlParameter("Column_Name", columnName)); 
cn.Open();
readAssess = cmdReadAssess.ExecuteReader();

while(readAssess.Read())
{
    // Add the rows
    chkAssess = readAssess.GetString(0);
}

return chkAssess;
}

答案 2 :(得分:1)

你在这里遇到了几个问题。

检查您的readAssess是否有如下所示的行。

if(readAssess.HasRows)

如果没有行,则尝试

chkAssess = readAssess.GetString(0);

会抛出此错误,因为Arrays是基于索引的。

所以你的代码应该如下所示

if(readAssess.HasRows)
{
    while(readAssess.Read())
    {
        chkAssess = readAssess.GetString(0);
    }
}

其他问题是你需要关闭阅读器和阅读器。之后的联系。

readAssess.Close();
cn.Close();

此外,您的代码可能容易受到SQL Injection的攻击。<​​/ p>

答案 3 :(得分:0)

if (reader.HasRows)
            {
                while (reader.Read())
                {
                    int result = Convert.ToInt32(reader.GetString(0)); 
                    Console.WriteLine(result);
                }
            }

最重要的是首先通过在SQL Server中执行来检查查询,看看是否有任何结果。 其次,根据您接收的输出类型将其转换为特定的数据类型(重要)。大多数人都将数据保存在varchar中。