powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADOCommand не возвращает Recordset ...
3 сообщений из 3, страница 1 из 1
ADOCommand не возвращает Recordset ...
    #32016033
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо из Excel подключиться к SQL Server и получить recordset
Код выглядит так :

Dim ADOConnection, ADOCommand, ADOTable As Object

Set ADOConnection = CreateObject("ADODB.Connection")
Set ADOCommand = CreateObject("ADODB.Command")
Set ADOTable = CreateObject("ADODB.Recordset")

ADOConnection.ConnectionString = CONNECTION_STRING
ADOConnection.CommandTimeout = 0
ADOConnection.ConnectionTimeout = 0
ADOConnection.Open

ADOCommand.CommandType = adCmdStoredProc
ADOCommand.ActiveConnection = ADOConnection
ADOCommand.CommandText = "spL_Fin_GetPortfalioGraph"
ADOCommand.Parameters.Append (ADOCommand.CreateParameter("@AgrNum", adChar, adParamInput, 35))


ADOCommand.Parameters.Item(0).Value = Trim(Cells(i, 1).Value)
ADOCommand.Prepared = True

Set ADOTable = ADOCommand.Execute

With ADOTable
.MoveFirst
For a = 1 To .RecordCount
....

внутри SP производиться два SELECT
примерно так :

SELECT @AgrNum=AgrNum FROM ....
SELECT * FROM ... WHERE AgrNum=@AgrNum


Но возвращаеться пустой набор, RecordCount=0 .... хотя на сервере (из QA) весе выполняеться нормльно !
подскажите что я делаю не правильно ?
...
Рейтинг: 0 / 0
ADOCommand не возвращает Recordset ...
    #32016036
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Во-первых, необходимо убедиться, что в VB подлючена ссылка на библиотеку ADO.
Во-вторых, в тексте используется синтаксис VB-Script для WEB-приложений, а не полноценного VB. В частности, я препочитаю использовать такую конструкцию:
Set ADOConnection = NEW ADODB.Connection
вместо такой:
Set ADOConnection = CreateObject("ADODB.Connection")
При использовании первого варианта ты сразу увидишь, все ли у тебя в порядке со ссылкой на библиотеку ADO. Если ссылка не установлена, после ввода пробела следом за директивой NEW в выпадающем списке объектов не будет библиотеки ADODB.
В-третьих, вместо:
ADOCommand.ActiveConnection = ADOConnection
необходимо писать:
Set ADOCommand.ActiveConnection = ADOConnection
В четвертых, вместо фразы:
ADOCommand.Parameters.Item(0).Value = Trim(Cells(i, 1).Value)
попробуй написать
ADOCommand.Parameters(1).Value = Trim(Cells(i, 1).Value) (если только не XP)
В пятых,
ADOCommand.Prepared = True
здесь совершенно ни к селу, ни к городу. Эта опция используется в параметризированных запросах во избежание их повторной компиляции при многократных вызовах (план таких запросов помещается в кэш). А хранимая процедура и так откомпилирована.
В-пятых, для корректного выставления значения RecordCount необходимо сначала переместить указатель в КОНЕЦ Recordset-а. Исходя из этого, лучше использовать не цикл FOR со счетчиком, а цикл
WHILE not ADOTable.EOF
EOF выставляется корректно и без специальных дерганий по рекордсету.
В-шестых, из приведенного Вами кусочка скрипта хранимой процедуры ясно, что хранимая процедура возвращает не один, а два Recordset-а. Тот Recordset, к которому Вы пытаетесь получить доступ в приведенном скрипте является первым из них. Для получения следующего Recorset-а необходимо использовать метод NextRecordset.
...
Рейтинг: 0 / 0
ADOCommand не возвращает Recordset ...
    #32016082
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помошь ... и такой обширный ответ !
все дело было в

.MoveFirst
For a = 1 To .RecordCount
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADOCommand не возвращает Recordset ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]