Команда ADO VB6 для SQL Server - PullRequest
       10

Команда ADO VB6 для SQL Server

2 голосов
/ 23 апреля 2010

Я получаю необъяснимую ошибку при выполнении команды ADO в VB6 для базы данных SQL Server 2005.

Вот код, демонстрирующий проблему:

Sub ADOCommand()
   Dim Conn As ADODB.Connection
   Dim Rs As ADODB.Recordset
   Dim Cmd As ADODB.Command

   Dim ErrorAlertID As Long
   Dim ErrorTime As Date

   Set Conn = New ADODB.Connection
   Conn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=database;Data Source=server"
   Conn.CursorLocation = adUseClient
   Conn.Open

   Set Rs = New ADODB.Recordset
   Rs.CursorType = adOpenStatic
   Rs.LockType = adLockReadOnly

   Set Cmd = New ADODB.Command
   With Cmd
      .Prepared = False
      .CommandText = "ErrorAlertCollect"
      .CommandType = adCmdStoredProc
      .NamedParameters = True
      .Parameters.Append .CreateParameter("@ErrorAlertID", adInteger, adParamOutput)
      .Parameters.Append .CreateParameter("@CreateTime", adDate, adParamOutput)
      Set .ActiveConnection = Conn
      Rs.Open Cmd

      ErrorAlertID = .Parameters("@ErrorAlertID").Value
      ErrorTime = .Parameters("@CreateTime").Value
   End With
   Debug.Print Rs.State ''// Shows 0 - Closed
   Debug.Print Rs.RecordCount ''// Of course this fails since the recordset is closed
End Sub

Итак, этот код работал не так давно, но теперь он не работает в последней строке с ошибкой:

Run-time error '3704': Operation is not allowed when the object is closed

Почему это закрыто? Я только что открыл его, и SP возвращает строки.

Я запустил трассировку, и вот что библиотека ADO фактически отправляет на сервер:

declare @p1 int
set @p1=1
declare @p2 datetime
set @p2=''2010-04-22 15:31:07:770''
exec ErrorAlertCollect @ErrorAlertID=@p1 output,@CreateTime=@p2 output
select @p1, @p2

Запуск этого отдельного пакета из моего редактора запросов приводит к:

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near '2010'.

Конечно, есть ошибка. Посмотрите на двойные одинарные кавычки там. Что, черт возьми, может быть причиной этого? Я попытался использовать adDBDate и adDBTime в качестве типов данных для параметра даты, и они дают одинаковые результаты.

Когда я задаю параметры adParamInputOutput, я получаю следующее:

declare @p1 int
set @p1=default
declare @p2 datetime
set @p2=default
exec ErrorAlertCollect @ErrorAlertID=@p1 output,@CreateTime=@p2 output
select @p1, @p2

Запуск этой отдельной партии дает:

Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'default'.
Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'default'.

Какого черта? SQL Server не поддерживает этот вид синтаксиса. Вы можете использовать только ключевое слово DEFAULT в фактическом операторе выполнения SP.

Я должен отметить, что удаление лишних одинарных кавычек из вышеприведенного оператора делает SP работоспособным.

... О боже. Я просто понял это. Я думаю, что все равно стоит публиковать.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

В дополнение к тому, что упомянул @ErikE, если ваш sproc содержит операторы PRINT (даже если он оставлен только для отладки), ADO также будет иметь корову, которая выдает точно такую ​​же ошибку, которую вы видите.

2 голосов
/ 23 апреля 2010

Ответ заключается в том, что хранимой процедуре нужно SET NOCOUNT ON вверху, поскольку ADO останавливается в тот момент, когда возвращается ответ «Затронуты строки», и хранимая процедура имеет оператор обновления перед окончательным выбором.

Я понятия не имею, почему трассировка показывает синтаксис от ADODB, который работает некорректно при отправке самостоятельно, но ясно, что библиотека ADODB НЕ получала ошибку в своих запросах.Вся проблема была SET NOCOUNT ON отсутствует.

...