我有一个数据库,其中有两列都是int类型。
一列称为“id”,另一列称为“counter”。
我使用SQLDataReader从数据库中读取
int id = (int)reader3["id"];
int counter = (int)reader3["counter"];
第一个变量“id”返回精细列的id值。但是第二个变量使用System.IndexOutOfRangeException停止执行:'counter'错误。
我无法真正调试此错误,因为当前上下文中不存在计数器。
con.Open();
SqlCommand cmd2 = new SqlCommand("SELECT id FROM categoryData WHERE CONVERT(DATE,Date) = CONVERT(DATE,GETDATE(),103) AND category = '" +
categoryList[i] + "'", con);
cmd2.ExecuteNonQuery();
SqlDataReader reader3 = cmd2.ExecuteReader();
while (reader3.Read())
{
int id = (int)reader3["id"];
int counter = (int)reader3["counter"];
cmd2.Parameters.Clear();
con.Open();
cmd2 = new SqlCommand("UPDATE categoryData SET counter = counter+1 WHERE
id = " + id + "", con);
cmd2.ExecuteNonQuery();
dateLabel.Text = categoryBox.SelectedItem.ToString();
recordedLabel.Text = "Count is: " + counter;
break;
}
答案 0 :(得分:3)
该错误实际上意味着您的select
语句中不包含您选择数据的任何表中的counter
列。
因此,您需要仔细检查您的查询是否返回了counter
类型为int
的列。
与reader3
相关联的查询应该类似于:
select id, counter from categoryData
where .......
<强>更新强>
因此,从您更新的问题中可以清楚地看到,您在查询中未选择counter
列,这可能是您在添加查询时遗漏的内容,因此应该是:
SqlCommand cmd2 = new SqlCommand("SELECT id,counter FROM categoryData WHERE
CONVERT(DATE,Date) = CONVERT(DATE,GETDATE(),103) AND category = '" +
categoryList[i] + "'", con);
还有一件重要的事情就是不要在查询中进行字符串连接,而是使用Parameterized queries来保护SQL Injection。
以下是参数化查询的代码:
SqlCommand cmd2 = new SqlCommand("SELECT id,couter FROM categoryData WHERE CONVERT(DATE,Date) = CONVERT(DATE,GETDATE(),103) AND category = @category",con);
cmd2.Parameters.AddWithValue("@category", categoryList[i]);
cmd2.ExecuteNonQuery();
希望它有所帮助!
答案 1 :(得分:0)
SELECT id,计数器 FROM categoryData WHERE ...
编辑:SqlQuery中的字符串连接不是最好的主意,这可以用于SqlInjection ...答案 2 :(得分:0)
您的问题是您的疑问。
"SELECT id FROM categoryData ..."
“counter”不是您正在检索的字段之一。需要说:
"SELECT id, counter FROM categoryData ..."