Получение ошибки «операция запрещена, когда объект закрыт» ошибка. В поисках решения - PullRequest
0 голосов
/ 12 июня 2019

Каждый раз, когда я запускаю свой файл vba, я получаю ошибку времени выполнения 3704, Операция не разрешена, когда объект закрыт.Попытка исправить эту ошибку.

Перепутаны с типами соединений и другими типами параметров, но безрезультатно.Целью этого кода является создание интерфейса для бизнеса для ввода данных в базу данных SQL.Бизнес не хочет расставаться с Excel для этого.Хранимая процедура, вызываемая в коде vba, вводит данные в базу данных SQL.Я проверил сохраненный процесс работает в SQL.Целью кода vba является вызов хранимой процедуры и импорт данных в базу данных 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 без необходимости выходить из бизнеса.

1 Ответ

0 голосов
/ 12 июня 2019

Я включил наборы записей в код, несмотря на то, что данные не были импортированы в 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, которая автоматически увеличивает первичный ключ.

...