Re[13]: Странное поведение MS SQL Server
От: Lexey Россия  
Дата: 25.10.02 13:30
Оценка:
Здравствуйте andik, Вы писали:


A>вся проблема в том, что ADO в Си и на VB

A>работает по разному

Чудес не бывает. Эквивалентный код должен давать одни и те же результаты.
Re[14]: Странное поведение MS SQL Server
От: andik  
Дата: 25.10.02 13:46
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте andik, Вы писали:


L>

A>>вся проблема в том, что ADO в Си и на VB
A>>работает по разному

L>Чудес не бывает. Эквивалентный код должен давать одни и те же результаты.


полность согласен

у нас было так:

была хранимая процедура, которая делала insert, а потом возвращала рекордсет
SET NOCOUNT OFF был

на VB, рекордсет возвращался без каких-либо проблем
на Cи, возникала проблема описанная в первом сообщении

поставили SET NOCOUNT ON все стало ОК

Как я говорил, до сути проблемы не докапывались, не было времени.
Re[13]: Странное поведение MS SQL Server
От: Merle Австрия http://rsdn.ru
Дата: 25.10.02 13:53
Оценка:
Здравствуйте Алекс, Вы писали:

А>Возможно. На самом деле (извини конечно) я тут тебя немного провоцировал. По другому от гуру ответа не добится.

Мда, до провоцировался.. из-за отсутствия VB под рукой пришлось в asp лезть...
Берем мой код процедуры, коннект должен быть через OLEDB провайдер.

Выполняем VB код
set RS = DB.Execute("tstproc")
Do while not RS.EOF
    Response.Write(RS(0))
    RS.MoveNext
Loop


и получаем ошибку Operation is not allowed when the object is closed
в строке где идет обращение к RS.EOF.

Далее модифицируем, вставляем set RS = RS.NextRecordset, сразу после вызова DB.Execute и запускаем...
Получаем тоже ошибку в строке с RS.EOF (!) но другую: Object required: 'RS'

Выводы? Поведение полностью согласуется с MSDN, тоесть объект был, но closed, так как non-returning row command.

Можем продолжить, дописываем к sp строку SELECT 1 и снова запускаем Asp, сначало закоментировав set RS = RS.NextRecordset получаем ту же ошибку в том же месте,
Operation is not allowed when the object is closed.
Раскоментируем взад, и любуемся законной единицей на экране...


А>И еще. Непонятно как установка nocount помогла в вышеописанном случае.

Вот так и помогла... closed рекордсет не генерится...
Мы уже победили, просто это еще не так заметно...
Re[15]: Странное поведение MS SQL Server
От: Merle Австрия http://rsdn.ru
Дата: 25.10.02 13:58
Оценка:
Здравствуйте andik, Вы писали:

A>была хранимая процедура, которая делала insert, а потом возвращала рекордсет

A>SET NOCOUNT OFF был
A>на VB, рекордсет возвращался без каких-либо проблем
A>на Cи, возникала проблема описанная в первом сообщении
A>поставили SET NOCOUNT ON все стало ОК
A>Как я говорил, до сути проблемы не докапывались, не было времени.

Вполне может быть что в VB вы через ODBC коннектились, там этой фичи нет.
Мы уже победили, просто это еще не так заметно...
Re[14]: Странное поведение MS SQL Server
От: Алекс Россия http://wise-orm.com
Дата: 25.10.02 13:59
Оценка:
Здравствуйте Merle, Вы писали:

хъ

M>Выполняем VB код

M>
M>set RS = DB.Execute("tstproc")
M>Do while not RS.EOF
M>    Response.Write(RS(0))
M>    RS.MoveNext
M>Loop
M>


M>и получаем ошибку Operation is not allowed when the object is closed

M>в строке где идет обращение к RS.EOF.

[]

Другими словами ты говоришь, что в VB работает так, а в ASP по другому? Может дело в том, что та напрямую юзаещь коннекшн, а я сначала создаю Command и выбираю через него?
Re[15]: Странное поведение MS SQL Server
От: Merle Австрия http://rsdn.ru
Дата: 25.10.02 14:30
Оценка: 31 (4)
Здравствуйте Алекс, Вы писали:

А>Другими словами ты говоришь, что в VB работает так, а в ASP по другому? Может дело в том, что та напрямую юзаещь коннекшн, а я сначала создаю Command и выбираю через него?

VB и asp работают одинаково, разница только в том что один скрипт а другой как бы нет, я не думаю что здесь есть разница в нашем случае.
Возможно разница действительно в работе объекта command.
На всякий случай, коннект должен быть через OLEDB, а не через ODBC, в ODBC этой фичи нет.

И так резюмируя и подводя всяческие итоги...
Мы обращаемся к серверу с просьбой вернуть нам рекордсет, мол дядь, дай пожалуйста, ну очень надо...
Дядя Сервер возвращает нам рекордсет и в нагрузку к нему, от широты душевной, дает некую служебнуюю информацию, отдельно от рекордсета.
Далее возможны варианты:
1.0 В рекордсете есть данные (иными словами запрос типа returning command), то все в порядке, нам этот довесок нервов не портит, мы его просто не замечаем и спокойно работаем с рекордсетом

1.1 В рекордсете данных нет, но потенциально они там могут быть (с нами попрежнему запрос типа returning command) то мы имеем EOF=BOF=true и щедроты дядюшки сервера, которые мы все так же не замечаем.

Далее самое интересное.
2.0 Данных нет, тоесть вообще нет они там даже не предполагаются (non-row-returning command), и у нас стоит nocount on... Дядя Сервер оказался строгий и вааще ничего не дал ни рекордсета ни денег...

2.1 Данных опять же даже не ожидается (все так же non-row-returning), но стоит nocount off, В этом случае Сервер демонстрирует просто атракцион неслыханных щедрот и говорит, что данных нема, но тут что-то про них завалялось. Но просто так он нам эту шелуху вернуть не может и чтобы отличить это дело от случая 1.1 возвращает нам рекордсет со статусом closed, ну и к нему этот довесок...

Возможно в случае 2.1 command от большого ума прибивает этот рекордсет....
Мы уже победили, просто это еще не так заметно...
Re[16]: Странное поведение MS SQL Server
От: Алекс Россия http://wise-orm.com
Дата: 25.10.02 14:33
Оценка:
Здравствуйте Merle, Вы писали:

хъ

По крайней мере смешно.
Re[17]: Странное поведение MS SQL Server
От: Merle Австрия http://rsdn.ru
Дата: 25.10.02 14:34
Оценка:
Здравствуйте Алекс, Вы писали:

А>По крайней мере смешно.

Ну да, правда она такая
Мы уже победили, просто это еще не так заметно...
Re[16]: Правильно
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.10.02 10:14
Оценка:
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.