2012-08-01 168 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