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

SELECT操作触发System.IndexOutOfRangeException异常求助

问题排查与解决:SQLite DataReader 索引越界异常

异常原因

SQLiteDataReader读取查询结果时,不识别带表别名前缀的列名。你的SQL语句中虽用a.portata指定列,但返回的结果集里列名仅为portata,用rdrEP["a.portata"]查找会因找不到对应列触发System.IndexOutOfRangeException。

解决方法

方案1:直接使用无表别名的列名读取

修改循环内的读取代码,去掉列名前的a.、b.前缀:

while (rdrEP.Read())
{
    string OUT_PORTATA = (string)rdrEP["portata"];
    Int64 OUT_QTA = (Int64)rdrEP["quantita"];
    Int64 OUT_QTA_ATT = (Int64)rdrEP["QUANTITA_ATTUALE"];
    MessageBox.Show(OUT_PORTATA);
}

方案2:给列添加明确别名(推荐)

在SQL语句中为列指定别名,后续用别名读取,避免列名冲突:

// 修改SQL语句,添加别名
string stmEP = "select a.portata as Portata,a.quantita as Quantita,b.QUANTITA_ATTUALE as QuantitaAttuale,a.COSTO_UNITARIO as CostoUnitario,a.SPESA_PORTATA as SpesaPortata from ORDINI a join QUANTITA_LIMITATE b on a.PORTATA = b.PORTATA WHERE a.CASSA = '" + MyGlobals.NOME_CASSA + "' ORDER BY a.ID,a.PORTATA;";

// 读取时使用定义的别名
while (rdrEP.Read())
{
    string OUT_PORTATA = (string)rdrEP["Portata"];
    Int64 OUT_QTA = (Int64)rdrEP["Quantita"];
    Int64 OUT_QTA_ATT = (Int64)rdrEP["QuantitaAttuale"];
    MessageBox.Show(OUT_PORTATA);
}

额外提示:避免SQL注入风险

当前代码直接拼接变量MyGlobals.NOME_CASSA到SQL语句中,存在SQL注入隐患,建议改用参数化查询:

string stmEP = "select a.portata as Portata,a.quantita as Quantita,b.QUANTITA_ATTUALE as QuantitaAttuale,a.COSTO_UNITARIO as CostoUnitario,a.SPESA_PORTATA as SpesaPortata from ORDINI a join QUANTITA_LIMITATE b on a.PORTATA = b.PORTATA WHERE a.CASSA = @NomeCassa ORDER BY a.ID,a.PORTATA;";

using var cmdEP = new SQLiteCommand(stmEP, sqlite);
cmdEP.Parameters.AddWithValue("@NomeCassa", MyGlobals.NOME_CASSA);
using SQLiteDataReader rdrEP = cmdEP.ExecuteReader();

内容的提问来源于stack exchange,提问作者Gianluca Bendinelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:44:59