【问题标题】:C# Error: Index was outside the bounds of the arrayC# 错误:索引超出了数组的范围
【发布时间】:2012-08-01 07:58:36
【问题描述】:

我收到“索引超出数组范围”。在 dr1[1].ToString().

我有 3 列的表contribution_master:type_id (int)、name (varchar(20)、amount (float)。 我想提取所有金额行。

SqlConnection SQLCon1 = new SqlConnection(ConfigurationManager.ConnectionStrings["PayrollConnStr"].ConnectionString.ToString());

    SqlCommand SQLCmd1 = new SqlCommand("SELECT amount FROM contribution_master", SQLCon1);

    try
    {
        SQLCon1.Open();
        SqlDataReader dr1 = SQLCmd1.ExecuteReader();
        while (dr1.Read())
        {
            employer_epf = Convert.ToDouble(dr1[0].ToString());
            employer_admin = Convert.ToDouble(dr1[1].ToString());
            employer_edli = Convert.ToDouble(dr1[2].ToString());
            employer_admin_edli = Convert.ToDouble(dr1[3].ToString());
            employer_esi = Convert.ToDouble(dr1[4].ToString());
        }
    }
    catch (SqlException ex)
    {
        string errorMessage = "Error ";
        errorMessage += ex.Message;
        lblWarn.Text = errorMessage;
        lblWarn.Visible = true;
    }
    finally
    {
        SQLCon1.Close();
    }

【问题讨论】:

    标签: c# asp.net sql-server


    【解决方案1】:

    dr1[x] 值与它从数据库中读取的列的位置有关。

    您指定SELECT amount FROM contribution_master 的SQL 将返回amount 列,但是其中的数据只能使用dr1[0]dr1["amount"] 访问。

    while (dr1.Read()) 将循环遍历每一行数据,直到没有更多数据为止。但是,如果您需要专门访问每一行,最好将数据填充到数据表中并从那里分配值。

    例如:

    SqlDataAdapter da = new SqlDataAdapter(SQLCmd1);
    DataTable dt = new DataTable();
    da.Fill(dt);
    
    employer_epf = Convert.ToDouble(dt.Rows[0][0].ToString());
    employer_admin = Convert.ToDouble(dt.Rows[1][0].ToString());
    employer_edli = Convert.ToDouble(dt.Rows[2][0].ToString());
    employer_admin_edli = Convert.ToDouble(dt.Rows[3][0].ToString());
    employer_esi = Convert.ToDouble(dt.Rows[4][0].ToString());
    

    希望这会有所帮助,但是将桌子的轴反过来不是更容易吗?

    【讨论】:

      【解决方案2】:

      您只从查询中返回一个字段(金额),因此数据读取器中只有一个字段(字段 0)

      datareader.Read() 的每次调用都会返回一行。如果您想要后续行,请再次致电Read()

      所以,在你的代码中...

      if (dr1.Read())
      {
          employer_epf = Convert.ToDouble(dr1[0].ToString()); 
          if (dr1.Read())
          {
              employer_admin = Convert.ToDouble(dr1[0].ToString()); 
              // etc...
          }
      }
      

      或者您可以填充一个DataTable,它将一次返回所有行。

      【讨论】:

        【解决方案3】:

        更改 SELECT 语句。 (您已经从表格中选择了amount 列)

        SELECT * FROM contribution_master
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-12
          • 2010-09-18
          • 1970-01-01
          • 2015-11-06
          • 2010-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多