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

ODBC连接下VBA执行INSERT...RETURNING无法获取返回ID求助

解决ODBC连接下INSERT RETURNING无法获取输出参数的问题

针对插入数据成功但无法返回ID1值的问题,可尝试以下调整方案:

1. 移除Recordset赋值,直接执行命令

INSERT ... RETURNING语句不会返回常规结果集,赋值给Recordset可能干扰驱动对输出参数的处理,修改执行代码:

.Execute  ' 不要用Set rs = .Execute

2. 匹配输出参数的数据类型

如果ID1是数值类型(比如Oracle的NUMBER),将ID_VAL的类型从adVarChar改为对应数值类型:

With ID_VAL
    .Name = "ID_VAL"
    .Type = ADODB.DataTypeEnum.adInteger  ' 或adNumeric根据实际字段类型调整
    .Direction = ADODB.ParameterDirectionEnum.adParamOutput
    .Size = 10  ' 对应数值类型的长度
End With

3. 启用命令预编译

添加.Prepared = True到Command配置中,确保驱动正确解析参数绑定:

With oCmd
    .Parameters.Append NAME_VAL
    .Parameters.Append ID_VAL
    .ActiveConnection = oraFunc.getConnection
    .CommandType = ADODB.CommandTypeEnum.adCmdText
    .CommandText = "INSERT INTO TABLE1(NAME1) VALUES(:NAME_VAL) RETURNING ID1 INTO :ID_VAL;"
    .Prepared = True  ' 新增该行
    .Execute
End With

完整修改后的代码示例

Sub doit()
Dim oCmd As Object
Dim NAME_VAL As Object, ID_VAL As Object

    oraCon.openConnection "EPAT", "minhaszt", "CaMgNa_2024"
    oraFunc.setConnection oraCon
    
    Set NAME_VAL = CreateObject("ADODB.Parameter")
    With NAME_VAL
        .Name = "NAME_VAL"
        .Type = ADODB.DataTypeEnum.adVarChar
        .Direction = ADODB.ParameterDirectionEnum.adParamInput
        .Value = "FREDO"
        .Size = Len("FREDO")
    End With
    
    Set ID_VAL = CreateObject("ADODB.Parameter")
    With ID_VAL
        .Name = "ID_VAL"
        .Type = ADODB.DataTypeEnum.adInteger  ' 假设ID1为整数类型
        .Direction = ADODB.ParameterDirectionEnum.adParamOutput
        .Size = 10
    End With
    
    Set oCmd = CreateObject("ADODB.Command")
    With oCmd
        .Parameters.Append NAME_VAL
        .Parameters.Append ID_VAL
        .ActiveConnection = oraFunc.getConnection
        .CommandType = ADODB.CommandTypeEnum.adCmdText
        .CommandText = "INSERT INTO TABLE1(NAME1) VALUES(:NAME_VAL) RETURNING ID1 INTO :ID_VAL;"
        .Prepared = True
        .Execute  ' 不赋值给Recordset
    End With
    
    Debug.Print ID_VAL.Value  ' 现在应能获取到ID值

    While oCmd.Parameters.Count > 0
        oCmd.Parameters.Delete (0)
    Wend
End Sub

额外排查点

  • 确认公司提供的ODBC驱动为官方Oracle ODBC驱动,部分第三方驱动对RETURNING子句的参数支持有限。
  • 检查TABLE1的ID1字段是否为自动生成的主键(如序列+触发器),确保插入时确实有值返回。

内容的提问来源于stack exchange,提问作者Z T Minhas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:47