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
相关产品推荐
相关产品推荐

