Здравствуйте Lexey, Вы писали:
L>Здравствуйте andik, Вы писали:
L> A>>вся проблема в том, что ADO в Си и на VB A>>работает по разному
L>Чудес не бывает. Эквивалентный код должен давать одни и те же результаты.
полность согласен
у нас было так:
была хранимая процедура, которая делала insert, а потом возвращала рекордсет
SET NOCOUNT OFF был
на VB, рекордсет возвращался без каких-либо проблем
на Cи, возникала проблема описанная в первом сообщении
поставили SET NOCOUNT ON все стало ОК
Как я говорил, до сути проблемы не докапывались, не было времени.
Здравствуйте Алекс, Вы писали:
А>Возможно. На самом деле (извини конечно) я тут тебя немного провоцировал. По другому от гуру ответа не добится.
Мда, до провоцировался.. из-за отсутствия 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 рекордсет не генерится...
Здравствуйте andik, Вы писали:
A>была хранимая процедура, которая делала insert, а потом возвращала рекордсет A>SET NOCOUNT OFF был A>на VB, рекордсет возвращался без каких-либо проблем A>на Cи, возникала проблема описанная в первом сообщении A>поставили SET NOCOUNT ON все стало ОК A>Как я говорил, до сути проблемы не докапывались, не было времени.
Вполне может быть что в VB вы через ODBC коннектились, там этой фичи нет.
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 и выбираю через него?
Здравствуйте Алекс, Вы писали:
А>Другими словами ты говоришь, что в 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 от большого ума прибивает этот рекордсет....