Я получаю необъяснимую ошибку при выполнении команды 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 работоспособным.
... О боже. Я просто понял это. Я думаю, что все равно стоит публиковать.