【问题标题】:VB6 Error when calling SQL Server SP: "Operation is not allowed when the object is closed"调用 SQL Server SP 时出现 VB6 错误:“对象关闭时不允许操作”
【发布时间】:2015-05-18 20:15:55
【问题描述】:

我有一个旧的 VB6 应用程序,它曾经连接到生产 sybase 数据库。该数据库最近迁移到 SQL Server 2008 R2,现在我正在更新应用程序以使其保持正常运行。 我得到的错误是“对象关闭时不允许操作”。

这是VB6上的代码结构:

Dim sql as String
Dim connString as String
Dim conn as New ADODB.Connection 

connString = "Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CatalogName;Data Source=Production_Server_Name;"
sql = "EXEC sp_name @param1, @param2, @param3, @param4"

conn.Open connString

Dim Cmd as ADODB.Command
Set Cmd = New ADODB.Command 
Set Cmd.ActiveConnection = conn
Cmd.CommandText = sql
Cmd.CommandType = adCmdText
Cmd.CommandTimeOut = 300

Dim rs as ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open sql, conn --> The Code fails on this line !!!

Set rs = Cmd.Execute() 

If rs Is Nothing Or IsNull(rs) Then
  Set rs = Nothing
  bla bla bla 
  bla bla
End

存储过程代码如下:

CREATE PROCEDURE sp_name 
(
    @param1 as integer, 
    @param2 as integer,
    @param3 as integer, 
    @param4 as nvarchar(150)
 )
 AS
  SET NOCOUNT ON

 -- All the code goes here

 RETURN

代码结构说明

  • @param1、@param2 和@param1 是整数定义的值。 @param4 是逗号分隔的字符串值
  • 我已经知道 ADODB 对象可以在同一行声明和实例化。

我已经做过验证/已经尝试过的建议没有成功

  • 当从 SSMS 以只读方式执行时,SP 可以完美运行 数据库用户。
  • SP 确实使用变量表 (@VariableTables) 作为中间 处理东西。
  • VB6 代码在调用“sp_who”内置 SQL Server SP 时有效
  • 当 sql 变量包含“SELECT TOP 1 Column FROM”时,VB6 代码可以工作 DB.dbo.Table"
  • SP 失败,即使使用完全合格的调用(EXEC DB.dbo.sp_name)
  • 即使删除 sql 变量的“EXEC”部分,SP 也会失败

非常感谢任何能说明此主题错误的词,并立即接受正确答案。

提前致谢

【问题讨论】:

  • 根据您已经尝试过的情况,SP 代码本身似乎存在问题。
  • 尝试注释掉SP的不同部分,然后当SP运行时,你就知道它在SP的哪个部分有问题了。
  • 另外,您可以运行 SQL Profiler 并打开错误捕获功能,这样您就可以看到如果在 SP 中创建了任何错误会发生什么。
  • 有几件事:1. 确保您使用的是客户端游标,2. 您是否尝试过使用不同的提供程序(如 sqloledb)
  • 您在执行命令之前缺少打开连接。

标签: sql-server sql-server-2008 stored-procedures vb6 adodb


【解决方案1】:

您需要先打开连接。

Dim rs as ADODB.Recordset
Set rs = New ADODB.Recordset

conn.Open()  <-- missing this

rs.Open sql, conn 

Set rs = Cmd.Execute() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多