2

我得到一个“索引超出了数组的范围。” 在 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();
    }
4

3 回答 3

3

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

您指定的 SQLSELECT amount FROM contribution_master将返回该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());

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

于 2012-08-01T08:35:36.203 回答
1

您只从查询中返回一个字段(金额),因此数据读取器中只有一个字段(字段 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将一次返回所有行的。

于 2012-08-01T07:59:53.037 回答
0

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

SELECT * FROM contribution_master
于 2012-08-01T08:00:00.917 回答