You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取SQLite查询结果触发IndexOutOfRangeException异常求助

异常原因分析
  • 根本问题出在SQL查询与代码读取的不匹配:SQL语句里第一个字段是date(EDate,'utc'),没有给这个计算后的字段指定别名,但代码中却尝试用dr["EDate"]读取它。SQLiteDataReader只能通过查询返回的列名/别名或索引位置访问字段,这里计算后的字段默认没有EDate这个列名,导致找不到对应字段,直接抛出索引越界异常。
解决方法

有两种直接可行的修复方式:

方案1:给查询字段加别名(推荐)

修改SQL语句,给date(EDate,'utc')指定别名EDate,让DataReader能识别这个列名:

string query = "SELECT date(EDate,'utc') AS EDate, Tag, Valuex, Note from collections where Account_Number = '1010011' AND Edate >= '2021-01-01'";

这样原代码里的dr["EDate"]就能正确匹配到查询结果的对应字段,无需改动其他代码。

方案2:通过索引位置读取字段

如果不想修改SQL,可以直接通过字段的索引位置读取(注意索引从0开始):

newentry.Add(new Values()
{
    Date = dr[0].ToString(), // 对应date(EDate,'utc')的结果
    Tag = dr["Tag"].ToString(),
    Value = dr["Valuex"].ToString(),
    Note = dr["Note"].ToString(),
});

不过这种方式可读性差,后续如果调整SQL里的字段顺序,很容易再次出错,优先选择方案1。

额外优化提示
  • 无需手动调用dr.Close(),using语句会自动释放SQLiteDataReader的资源。
  • 建议给字段读取添加空值判断,避免出现NullReferenceException,比如:
// 用别名的情况
Date = dr.IsDBNull(dr.GetOrdinal("EDate")) ? string.Empty : dr["EDate"].ToString();
// 用索引的情况
Date = dr.IsDBNull(0) ? string.Empty : dr[0].ToString();

内容的提问来源于stack exchange,提问作者Harshal Gandhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:03:21