2012-08-01 109 views
2

我得到一个“索引超出了数组边界”。在dr1 [1] .ToString()。C#错误:索引超出了数组的界限

我有3列的表contribution_master:TYPE_ID(INT),名(VARCHAR(20),量(浮点) 我想提取所有的量行

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

回答

3

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()); 

希望这会有所帮助,但岂不是更容易让你的桌子周围的其他方式的轴?

+0

感谢您的解释。 – user1557308 2012-08-01 08:41:12

+0

没问题! :d – Elliott 2012-08-01 08:46:02

1

你只是。从查询(量)返回一个字段所以在DataReader的唯一一个场(场0)

datareader.Read()每次调用返回单行。如果你想后续行,再打电话Read()

小号O,在你的代码...

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

或者你可以填充DataTable将立即返回所有行。

0

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

SELECT * FROM contribution_master