使用ADODB操作PostgreSQL记录集调用AddNew报错,求助排查原因
问题:ADODB连接PostgreSQL添加记录时报错
PostgreSQL端操作
用户创建了如下表:
create table test (description varchar) ;
ADODB连接与记录集操作
数据库连接代码
dim test_conn As ADODB.Connection dim test_str As String Set test_conn = New ADODB.Connection If test_conn.State = 0 Then test_str = "PROVIDER=MSDASQL.1;DSN=PostgreSQL35W" _ & ";DATABASE=database_name" _ & ";SERVER=database_server" _ & ";PORT=database_port" _ & ";UID=user_name" _ & ";PWD=user_pwd" test_conn.CursorLocation = adUseServer test_conn.Mode = adModeReadWrite test_conn.Open test_str End If
打开记录集
Dim test As ADODB.Recordset Set test = New ADODB.Recordset test.Open "select * from test", test_conn, adOpenDynamic, adLockOptimistic, adCmdText
记录集支持性检查
检查结果显示记录集支持更新操作:
test.Supports(adAddNew) => True test.Supports(adUpdate) => True test.Supports(adDelete) => True
报错情况
执行添加记录操作时触发运行时错误:
test.AddNew "description", "test_descr"
错误信息:
Run-time error '-2147217887 (80040e21)': Multiple-step operation generated errors. Check each status value.
解决办法
1. 为PostgreSQL表添加主键
ADODB的可更新记录集依赖表的主键来唯一标识记录,无主键时ODBC驱动无法正确处理插入/更新操作。修改表结构添加主键:
-- 推荐方式:新增自增主键字段 ALTER TABLE test ADD COLUMN id SERIAL PRIMARY KEY; -- 特殊场景:若description字段值绝对唯一,可设为主键 ALTER TABLE test ADD PRIMARY KEY (description);
2. 明确varchar字段长度
创建表时指定varchar字段长度,避免驱动处理时出现类型匹配问题:
CREATE TABLE test ( id SERIAL PRIMARY KEY, description VARCHAR(255) );
3. 调整AddNew的使用方式
AddNew "字段名", "值"语法合法,但分开赋值后调用Update的方式更稳定,避免驱动解析参数出错:
test.AddNew test("description") = "test_descr" test.Update
4. 检查ODBC驱动配置
- 确保DSN中使用的PostgreSQL ODBC驱动版本(PostgreSQL35W)与服务器版本兼容
- 尝试直接使用PostgreSQL OLE DB Provider替代MSDASQL,连接字符串示例:
test_str = "PROVIDER=PostgreSQL OLE DB Provider;" _ & "DATA SOURCE=database_server;" _ & "PORT=database_port;" _ & "DATABASE=database_name;" _ & "UID=user_name;" _ & "PWD=user_pwd"
内容的提问来源于stack exchange,提问作者Edouard
相关产品推荐
相关产品推荐

