【问题标题】:DataReader IndexOutofRangeException was unhandled by user code用户代码未处理 DataReader IndexOutofRangeException
【发布时间】:2014-03-04 12:46:47
【问题描述】:

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

chkAssess = readAssess[columnName].ToString();

下面是sn-p的代码:

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

【问题讨论】:

    标签: c# asp.net sqldatareader datareader


    【解决方案1】:

    尝试使用不带''的列名

    select something from table 
    

    而不是

    select 'something' from table
    
    1. 出于安全原因,请勿以这种方式创建 sql 查询(通过连接字符串) - 请改用 @parameters

    2。最后关闭阅读器

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        【解决方案3】:

        这里有几个问题。

        检查您的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 的攻击。

        【讨论】:

          【解决方案4】:
          if (reader.HasRows)
                      {
                          while (reader.Read())
                          {
                              int result = Convert.ToInt32(reader.GetString(0)); 
                              Console.WriteLine(result);
                          }
                      }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-28
            • 2014-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多