使用System.Data.Odbc操作Vertica时INSERT报列不存在错误求助
问题解决:Vertica ODBC插入时提示列不存在
问题根源
- Vertica标识符大小写规则:Vertica默认会将未用双引号包裹的表名、列名转换为小写存储。你的CREATE TABLE语句中列名(如
Username、Environment)未加双引号,实际数据库中存储的列名是小写(username、environment),而INSERT语句中使用的大写列名会被ODBC驱动识别为带引号的标识符,与实际列名不匹配,导致"列不存在"错误。 - 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
相关产品推荐
相关产品推荐

