出现错误“关闭对象时不允许操作”错误。寻找解决方案

时间:2019-06-11 21:47:32

标签: excel vba adodb

每次运行vba文件时,都会收到运行时错误3704,当对象关闭时,不允许进行操作。试图解决此错误。

缺少连接类型和其他参数类型,但无济于事。该代码的目标是成为企业将数据输入SQL数据库的前端手段。企业不希望为此而离开Excel。在vba代码中调用的存储的proc将数据输入到SQL数据库中。我已经验证了存储的proc在SQL中可以工作。 vba代码的目标是调用存储的proc并将数据导入sql数据库。我用一个测试数据库和一个变量完成了此操作。现在我有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。

1 个答案:

答案 0 :(得分:0)

尽管没有数据导入到excel中,但我还是在代码中包含了记录集。在蒂姆·威廉姆斯(用户: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

我没有清除D3中用于PK的数据,我具有一个vba功能,该功能可以自动递增主键。