首页 > 解决方案 > 收到错误“对象关闭时不允许操作”错误。寻找解决方案

问题描述

每次我运行我的 vba 文件时,我都会收到运行时错误 3704,对象关闭时不允许操作。试图修复这个错误。

搞乱了连接类型和其他参数类型,但无济于事。该代码的目标是成为业务将数据输入 SQL 数据库的前端手段。企业不希望为此离开 excel。vba 代码中调用的存储过程将数据输入到 SQL 数据库中。我已经验证了存储过程在 SQL 中的工作原理。vba 代码的目标是调用存储的 proc 并将数据导入 sql 数据库。我已经用一个测试数据库和一个 var 完成了这个。现在我有 27 个。试图找出错误。

有 27 个变量,我没有包括所有变量。我验证他们都从 excel 中提取了正确的数据。我还让其他人验证这些参数是 SQL 中的正确参数。

Sub ImportProForma()

Dim rs As ADODB.Recordset
Dim cnSQL As ADODB.Connection
Dim sqlCommand As ADODB.Command, PKprm As Object

Dim PK As Integer
PK = Range("D3").Value

Sheets("UpdateProForma").Select
Set cnSQL = New ADODB.Connection
cnSQL.Open "Provider=SQLOLEDB; Integrated Security = sspi; Initial Catalog = [Database]; Data Source = [Server]"

Set sqlCommand = New ADODB.Command
sqlCommand.ActiveConnection = cnSQL
sqlCommand.CommandType = adCmdStoredProc

sqlCommand.CommandText = "ImportNewEntry"

Set PKprm = sqlCommand.CreateParameter("PrimaryKey", adInteger, adParamInput)
PKprm.Value = PK

sqlCommand.Parameters.Append PKprm
sqlCommand.Parameters("PrimaryKey") = PK


Set rs = New ADODB.Recordset
rs.CursorType = adOpenStatic
rs.LockType = adLockOptimistic
rs.Open sqlCommand

rs.Close
Set rs = Nothing

End Sub

这个项目的最终目标是能够将数据导入SQL,而不必有业务休假excel。

标签: excelvbaadodb

解决方案


尽管没有数据导入 excel,但我在代码中包含了记录集。在 Tim Williams(用户:478884)指出我不需要记录集之后。我删除了 rs 和其他不必要的代码。现在代码如下:

Sub ImportProForma()

Dim rs As ADODB.Recordset
Dim cnSQL As ADODB.Connection
Dim sqlCommand As ADODB.Command, PKprm As Object

Dim PK As Integer
PK = Range("D3").Value

Sheets("UpdateProForma").Select
Set cnSQL = New ADODB.Connection
cnSQL.Open "Provider=SQLOLEDB; Integrated Security = sspi; Initial Catalog = [Database]; Data Source = [Server]"

Set sqlCommand = New ADODB.Command
sqlCommand.ActiveConnection = cnSQL
sqlCommand.CommandType = adCmdStoredProc
sqlCommand.CommandText = "ImportNewEntry"

Set PKprm = sqlCommand.CreateParameter("PrimaryKey", adInteger, adParamInput)
PKprm.Value = PK

sqlCommand.Parameters.Append PKprm
sqlCommand.Parameters("PrimaryKey") = PK

sqlCommand.Execute
Cells.Range("D5:D55").ClearContents

End Sub

我没有为 PK 清除 D3 中的数据,我有一个自动递增主键的 vba 函数。


推荐阅读