【问题标题】:System.IndexOutOfRangeException: 'counter' - beginner [closed]System.IndexOutOfRangeException:'counter' - 初学者[关闭]
【发布时间】:2023-09-27 10:14:01
【问题描述】:

我有一个数据库,它有两列都是 int 类型。

一列称为“id”,另一列称为“计数器”。

我正在使用 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;
}

【问题讨论】:

  • 显示使用的sql查询
  • 我喜欢你没有在一个帖子中把你的整个项目都搞砸的事实。但是,这缺少很多代码。请添加包含 sql 的整个方法
  • 好吧,你做错了,不要那样做
  • 如果 code = wrong then Dont() end if?
  • reader3.Read() 正在读取您未向我们展示的代码中定义的查询结果。您需要更进一步的代码块并显示该查询。

标签: c# sql exception


【解决方案1】:

该错误实际上意味着您的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();

希望对你有帮助!

【讨论】:

  • 请开始使用参数!它使您的代码更具可读性和安全性。
  • 我会的。感谢您的建议,确实很有帮助。不敢相信我犯了这么愚蠢的错误。
  • 有没有人有一个很好的使用参数的教程来源?我发现的每个人都对 Sql 注入演示很迟钝或时间过长。
【解决方案2】:

您的问题是您的查询。

"SELECT id FROM categoryData ..."“counter”不是您要检索的字段之一。它需要说:

"SELECT id, counter FROM categoryData ..."

【讨论】:

    【解决方案3】:

    SELECT id, counter FROM categoryData WHERE...

    编辑:SqlQuery 中的字符串连接不是最好的主意,这可以用于 SqlInjection...

    【讨论】:

    • 我是个多么愚蠢的人