System.IndexOutOfRangeException:'counter' - 初学者

时间:2018-02-23 14:54:36

标签: c# sql exception

我有一个数据库,其中有两列都是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;
}

3 个答案:

答案 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 ..."