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

