[英]Index was outside on the bounds of array error on c# log in with SQL
[英]C# Error: Index was outside the bounds of the array
我得到一个“索引超出数组的范围。” 在dr1 [1] .ToString()。
我有3列的表tribution_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();
}
dr1[x]
值与其从数据库中读取的列的位置有关。
您指定的SELECT amount FROM contribution_master
dr1[0]
的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)
每次对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
。
更改SELECT语句。 (您已经从表格中选择了amount
列)
SELECT * FROM contribution_master
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.