【问题标题】:Excel VBA executing SQL Server stored procedure - result set throwing error 3704Excel VBA 执行 SQL Server 存储过程 - 结果集抛出错误 3704
【发布时间】:2013-08-31 12:58:16
【问题描述】:

我正在尝试从 Excel VBA 执行 SQL Server 存储过程。该过程将行返回到结果集对象中。但是,在运行代码时,它会抛出一个错误:

3704 对象关闭时不允许操作

注意:
数据库连接没有问题,因为在同一连接对象上运行的Select 查询工作正常。

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Dim rst As New ADODB.Recordset

Set cn = New ADODB.Connection
Set cmd = New ADODB.Command
ThisWorkbook.initialize
cn.Provider = "sqloledb"
cn.Properties("Data Source").Value = ThisWorkbook.server
cn.Properties("Initial Catalog").Value = ThisWorkbook.db
cn.Properties("User ID").Value = "xxxxx"
cn.Properties("Password").Value = "xxxxx"
cn.Open

Set cmd = New ADODB.Command
cmd.CommandText = "Generate_KPI_Process_Quality_Check_RunTime"
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = cn

Set prm = cmd.CreateParameter("@currentMonth", adChar, adParamInput, 255, cmb_month.Value)
cmd.Parameters.Append prm

Set prm = cmd.CreateParameter("@center", adChar, adParamInput, 255, cmb_center.Value)
cmd.Parameters.Append prm

rst.CursorType = adOpenStatic
rst.CursorLocation = adUseClient
rst.CursorLocation = adUseServer
rst.LockType = adLockOptimistic

rst.Open cmd

If (rst.BOF And rst.EOF) Then
'Some Code
End If

【问题讨论】:

  • 在哪一行抛出这个错误?
  • 嗨@jerussell,它在代码段末尾的 If (rst.BOF And rst.EOF) Then... 语句中抛出错误。跨度>
  • @Abhishek Panda 这些答案是否解决了您的问题?如果是,请点赞和/或标记为已回答。
  • 我很肯定你需要使用 set 关键字,或者删除第一条语句并使用@mehow提出的解决方案

标签: sql sql-server excel vba stored-procedures


【解决方案1】:

SET NOCOUNT ON

在存储过程中——这将阻止输出文本生成,如“1 条记录已更新”。

【讨论】:

  • 欢迎来到stackoverflow!这个答案有点简洁,你能解释一下这是如何解决问题的吗?
  • Corley,看起来存储过程输出干扰了结果记录集,因此 OLEDB 提供程序无法接收记录集。 SET NOCOUNT ON 防止在 INSERT/UPDATE 等上生成输出文本。
  • Another question 询问同样的错误(在 VB6 中),建议的答案是 SET NOCOUNT。
【解决方案2】:

你必须为Recordset ObjectOpen方法提供更多参数

试试rst.Open cmd, cn

【讨论】:

  • 连接对象是一个可选参数。它可能会解决由错误分配“cmd.ActiveConnection = cn”引起的问题
  • 确实可以。但是,如果他决定采用您的解决方案,他最好通过删除有问题的语句来清理他的代码,这可能会在未来成为混乱的根源。
  • @mehow - 我尝试了你的解决方案,我得到了这个:运行时错误'3707':无法更改在其源中具有 Command 对象的 Recordset 对象的 ActiveConnection 属性
  • @AbhishekPanda 你试过command.execute 方法吗?
【解决方案3】:

使用 Set 关键字来分配对象:

Set cmd.ActiveConnection = cn

否则,将分配 Connection 对象的默认属性(恰好是连接字符串)来代替 Connection 对象本身。

【讨论】:

  • 感谢您的帮助。然而,这并没有奏效。它仍然是旧的 3704 错误。
  • 我很肯定这是一个问题,您必须使用 set 或 delete 整个语句并使用 @mehow 解决方案。
【解决方案4】:

只需放置另一个包含结果集的记录集

Dim rst1 As New ADODB.Recordset
SET rst1=rst.NextRecordset 'this will return the first resultset

If rst1.BOF or rst1.EOF Then...
    'some code
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多