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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:59:59