C#查询Snowflake数据库遇索引越界错误求助
解决索引越界错误的方案
错误原因及修复步骤
1. 参数访问索引错误
你添加参数时使用的键名是"line_id",但后续访问参数时用了command.Parameters[":line_id"]。Snowflake的参数集合中存储的是不带冒号的参数名,因此:line_id不存在于集合中,直接访问会触发索引越界。
修复方式:
将参数访问语句改为不带冒号的键名,或者直接在添加参数时赋值:
// 方式一:修改参数访问的键名 command.Parameters.Add(new SnowflakeDbParameter("line_id", Snowflake.Data.Core.SFDataType.TEXT)); command.Parameters["line_id"].Value = line_id; // 方式二:添加参数时直接赋值(更简洁) command.Parameters.Add(new SnowflakeDbParameter("line_id", Snowflake.Data.Core.SFDataType.TEXT) { Value = line_id });
2. DataReader列索引越界
你通过固定索引(如reader.GetString(13))读取查询结果,但select *返回的列数可能少于14列,或者列顺序发生变化,导致索引超出有效范围。
修复方式:
- 明确指定查询列,避免依赖
select *的不确定性; - 通过列名获取索引,替代固定数字索引,增强代码稳定性:
// 用列名获取对应索引,再读取值 failureinfo.FA_KEY = reader.GetString(reader.GetOrdinal("FA_KEY")); failureinfo.LINE_ID = reader.GetInt32(reader.GetOrdinal("LINE_ID")).ToString(); failureinfo.THEATER = reader.GetString(reader.GetOrdinal("THEATER")); // 其他字段同理替换
3. 额外优化建议
- 确保
line_id从Request.Query获取的值不为空,避免无意义的查询; - 补充异常捕获逻辑,方便排查后续错误;
- 配置正确的Snowflake连接字符串(原代码中为空,需补充)。
修改后的完整代码示例
public void OnGet() { string line_id = Request.Query["line_id"]; Console.WriteLine(line_id); try { string connectionString = "你的Snowflake连接字符串"; // 替换为实际连接字符串 using (SnowflakeDbConnection connection = new SnowflakeDbConnection(connectionString)) { connection.Open(); // 明确指定查询列,避免select *的不确定性 string sql = @"SELECT FA_KEY, LINE_ID, THEATER, FR_ID, FR, OWNER, NOTES, FR_CODE, F_TYPE, FAILURE_CATEGORY_L3, LEAD_ORG, FAILURE_CATEGORY_L2, FAILURE_CATEGORY_L1, REPORT_CODE FROM CX_DB.CX_GSLOBAC_BR.XXBAC_SDPOP_FAILURE_REASONS_DUMMY WHERE LINE_ID = :line_id"; Console.WriteLine(sql); using (SnowflakeDbCommand command = new SnowflakeDbCommand(sql, connection)) { command.Parameters.Add(new SnowflakeDbParameter("line_id", Snowflake.Data.Core.SFDataType.TEXT) { Value = line_id }); using (SnowflakeDbDataReader reader = (SnowflakeDbDataReader)command.ExecuteReader()) { if (reader.Read()) { Failureinfo failureinfo = new Failureinfo(); // 通过列名获取索引读取数据 failureinfo.FA_KEY = reader.GetString(reader.GetOrdinal("FA_KEY")); failureinfo.LINE_ID = reader.GetInt32(reader.GetOrdinal("LINE_ID")).ToString(); failureinfo.THEATER = reader.GetString(reader.GetOrdinal("THEATER")); failureinfo.FR_ID = reader.GetString(reader.GetOrdinal("FR_ID")); failureinfo.FR = reader.GetString(reader.GetOrdinal("FR")); failureinfo.OWNER = reader.GetString(reader.GetOrdinal("OWNER")); failureinfo.NOTES = reader.GetString(reader.GetOrdinal("NOTES")); failureinfo.FR_CODE = reader.GetString(reader.GetOrdinal("FR_CODE")); failureinfo.F_TYPE = reader.GetString(reader.GetOrdinal("F_TYPE")); failureinfo.FAILURE_CATEGORY_L3 = reader.GetString(reader.GetOrdinal("FAILURE_CATEGORY_L3")); failureinfo.LEAD_ORG = reader.GetString(reader.GetOrdinal("LEAD_ORG")); failureinfo.FAILURE_CATEGORY_L2 = reader.GetString(reader.GetOrdinal("FAILURE_CATEGORY_L2")); failureinfo.FAILURE_CATEGORY_L1 = reader.GetString(reader.GetOrdinal("FAILURE_CATEGORY_L1")); failureinfo.REPORT_CODE = reader.GetString(reader.GetOrdinal("REPORT_CODE")); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } }
内容的提问来源于stack exchange,提问作者Devaraj Mani Maran
相关产品推荐
相关产品推荐

