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

使用System.Data.Odbc操作Vertica时INSERT报列不存在错误求助

问题解决:Vertica ODBC插入时提示列不存在

问题根源

  1. Vertica标识符大小写规则:Vertica默认会将未用双引号包裹的表名、列名转换为小写存储。你的CREATE TABLE语句中列名(如Username、Environment)未加双引号,实际数据库中存储的列名是小写(username、environment),而INSERT语句中使用的大写列名会被ODBC驱动识别为带引号的标识符,与实际列名不匹配,导致"列不存在"错误。
  2. ODBC参数格式限制:System.Data.Odbc.OdbcCommand不支持@XXX格式的命名参数,必须使用位置占位符?。使用命名参数会导致驱动解析异常,进一步引发列名识别错误。

修正后的测试代码

public void Save(SwissportStateModel model)
{
    using (OdbcConnection conn = _db.GetConnection())
    {
        // 列名改为小写匹配实际存储,参数用?占位符
        string query = "INSERT INTO flexautomatisation.tbl_swissport_test (username) VALUES (?)";

        conn.Open();
        using (OdbcCommand cmd = new OdbcCommand(query, conn))
        {
            // 按SQL中参数顺序添加,无需指定名称
            cmd.Parameters.AddWithValue("?", "John");
            cmd.ExecuteNonQuery();
        }
    }
}

修正后的正式代码

DateTime localDate = DateTime.Now;

// 列名改为小写,参数用?占位符
string cmdstring = "INSERT INTO flexautomatisation.tbl_swissport_state (environment, schedule, islaunch, created_at) VALUES (?, ?, ?, ?)";

using (OdbcConnection conn = _db.GetConnection())
{
    conn.Open();
    using (OdbcCommand cmd = new OdbcCommand(cmdstring, conn))
    {
        // 严格对应SQL中参数的顺序添加
        cmd.Parameters.AddWithValue("?", model.Environment);
        cmd.Parameters.AddWithValue("?", model.Schedule);
        cmd.Parameters.AddWithValue("?", model.IsLaunch);
        cmd.Parameters.AddWithValue("?", localDate);

        cmd.ExecuteNonQuery();
    }
}

额外注意事项

  • 若需在Vertica中保留列名大小写,创建表时需用双引号包裹列名(如"Username"),但后续所有SQL语句引用该列时必须同样使用双引号。
  • 始终使用using语句管理数据库连接和命令对象,无需手动调用Close(),避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:41:15