ADO+MSSQL2000: SELECTы в хранимой процедуре

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
SereginDV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 15.07.2004 (Чт) 16:47

ADO+MSSQL2000: SELECTы в хранимой процедуре

Сообщение SereginDV » 15.07.2004 (Чт) 17:21

Неужели с этим только я столкнулся?
В БД (MSSQL 2000 SP3a, ADO 2.8) есть процедура PROCNAME, в конце которой выполняется SELECT, в VB пишу:
Код: Выделить всё
Set rst = New ADODB.Recordset
rst.Open "exec PROCNAME", cnn
MsgBox rst.Fields(0).Value

Так вот, опытным путем установлено, что если в процедуре встретится слово SELECT, но не то, которое возвращает данные, например:
Код: Выделить всё
CREATE PROCEDURE PROCNAME AS
   CREATE TABLE #qqq(id INT)
   INSERT INTO #qqq SELECT 1
   SELECT id FROM #qqq
GO

на MsgBox получим ругань: Run-time Error '3704': Operation is not allowed when the object is closed, без каких-либо ошибок при вызове rst.Open.
Однако, если слов SELECT до возврата данных не встретится:
Код: Выделить всё
CREATE PROCEDURE PROCNAME AS
   CREATE TABLE #qqq(id INT)
   INSERT INTO #qqq VALUES (1)
   SELECT id FROM #qqq
GO

то единица возвратится и MsgBox ее успешно покажет.

Я уж и так, и сяк с этим...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 15.07.2004 (Чт) 17:52

Прикольно. Впервые такое вижу. Это только в тестовом примере или и при реальных инсертах тоже?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.07.2004 (Пт) 7:22

Вставь в начало процедуры
Код: Выделить всё
SET NOCOUNT ON

и в конец
Код: Выделить всё
SET NOCOUNT OFF
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SereginDV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 15.07.2004 (Чт) 16:47

Сообщение SereginDV » 16.07.2004 (Пт) 9:32

2 Ennor
Ясное дело, на реальных, иначе б вопроса не было :wink:
2 Andrey Fedorov
Спасибо, помогло.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.07.2004 (Пт) 9:35

И, кстати, это не баг. Так и должно быть
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SereginDV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 15.07.2004 (Чт) 16:47

Сообщение SereginDV » 16.07.2004 (Пт) 9:41

Однако, в Delphi это прокатывает без включения NOCOUNT, так что не знаю, не знаю...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.07.2004 (Пт) 9:49

В данном случае выполненая процедура возвращала два Recordset. В первом было количество строк обработанных INSERT-ом.
Во втором результат собственно SELECT-a.

SereginDV:
Почему в Delphi прокатывает - мне неизвестно. Возможно там где-то в настройках был включен NOCOUNT...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SereginDV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 15.07.2004 (Чт) 16:47

Сообщение SereginDV » 16.07.2004 (Пт) 10:01

Однако, INSERT INTO ... VALUES ... и UPDATE ... SET ... тоже возвращают количество строк (@@ROWCOUNT), но на них открытие Recordset'a не обламывается, только на SELECT. И коли первый SELECT возвращает количество строк, почему ж Recordset после этого остается закрытым?
Как понимаю, в этом случае я не должен обломаться на обращении к свйству Recordset.EOF и, вызвав Recordset.NextRecordset получить то, что мне нужно, однако это не так.
А это описано где-нибудь (в MSDN например)?


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList