【问题标题】:ADO Oracle Operation is not allowed when the object is closed对象关闭时不允许执行 ADO Oracle 操作
【发布时间】:2014-12-22 19:15:42
【问题描述】:

我有一个 Excel 2013 VBA 宏,它需要在 Oracle 12c 数据库上调用 SQL 过程。 Oracle 过程已执行(它将结果写入表中),但在 Excel 中我在Set rs = cmd.Execute 收到错误:

Operation is not allowed when the object is closed

代码下方:

Dim v_userpw As String

Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim l_userpw, l_reqid, l_pwhash, l_sighash As New ADODB.Parameter
Dim objErr As ADODB.Error

v_userpw = Cells(7, 1).Value

On Error GoTo err_test
'Set cnn = CreateObject("ADODB.Connection")
Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=devdb;User ID=db1;Password=db1;"
cnn.Open
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cnn
Set l_userpw = cmd.CreateParameter("l_userpw", adVarChar, adParamInput, 1024, v_userpw)
cmd.Parameters.Append l_userpw
Set l_reqid = cmd.CreateParameter("l_reqid", adVarChar, adParamOutput, 1024)
cmd.Parameters.Append l_reqid
Set l_pwhash = cmd.CreateParameter("l_pwhash", adVarChar, adParamOutput, 1024)
cmd.Parameters.Append l_pwhash
Set l_sighash = cmd.CreateParameter("l_sighash", adVarChar, adParamOutput, 1024)
cmd.Parameters.Append l_sighash

'cmd.Properties("PLSQLRSet") = True
cmd.CommandText = "{CALL db1.genheader(?, ?, ?, ?)}"
Set rs = cmd.Execute
'cmd.Properties("PLSQLRSet") = False

Cells(8, 1) = rs.Fields("reqid").Value
Cells(9, 1) = rs.Fields("pwhash").Value
Cells(10, 1) = rs.Fields("sighash").Value

cnn.Close

err_test:
MsgBox Error$
For Each objErr In cnn.Errors
    MsgBox objErr.Description
Next
cnn.Errors.Clear
Resume Next

Oracle 过程如下所示:

create or replace procedure genheader (
l_userpw in varchar2,
l_reqid out varchar2,
--l_pwhash out raw,
--l_sighash out raw
l_vpwhash out varchar2,
l_vsighash out varchar2
)

我需要返回预定义单元格中的值。

【问题讨论】:

  • 感谢您的建议,但这是一个 SQL Server 参数。我使用 Oracle 作为后端。

标签: oracle excel ado vba


【解决方案1】:

过程是否真的返回结果集?看起来它只是使用输出参数返回数据,因此您不会从记录集中获取结果,而是在命令执行后从命令参数中获取结果。

cmd.Execute

Cells(8, 1) = cmd("l_reqid")
Cells(9, 1) = cmd("l_pwhash")
Cells(10, 1) = cmd("l_sighash")

【讨论】:

    【解决方案2】:

    在将连接分配给命令对象的 ActiveConnection 属性之前,尝试测试连接状态以确保它处于打开状态。这会导致不稳定的行为。如果您不想在代码中执行此操作,您可以在设置的代码行之前分配一个断点并检查您的本地窗口以了解连接状态。您还需要指定 Oracle 存储过程的名称

    cmd.Name = "genheader"

    干杯, 鲍里斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多