powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADO & errors
7 сообщений из 7, страница 1 из 1
ADO & errors
    #32026842
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, я понимаю, что эта тема навязла в зубах. Но никто так и не дал на нее удовлетворительного ответа. Почему ADO в некоторых случаях не "видит" ошибок при выполнении запросов?

set nocount on не помогает!!!


Привожу пример:

1. SQL script

create table t1(col1 int not null unique)
go
insert into t1 (col1) values (1)
go

create proc sp1
as
begin
set nocount on
select count(*) from sysobjects
insert into t1 (col1) values (1)
end
go

2. VBS script, который его использует:

on error resume next
strConnectionString = "..."

Function ProcessMessage(nStep)
If (Err.Number <> 0) Then
MsgBox "Step: " & CStr(nStep) & Chr(13) + Chr(10) & "Error occured (" & Hex(Err.Number) & "): " & Err.Description
End If
End Function

set cn = CreateObject("ADODB.Connection")
ProcessMessage(1)

cn.Open strConnectionString
ProcessMessage(2)

cn.Execute "set nocount on"
ProcessMessage(3)

cn.Execute "exec sp1"
ProcessMessage(4)

MsgBox "Finish"
-------------------------------------------------------------------------
Если в теле процедуры есть select "вовне", т.е. не во временную таблицу и не в переменную, то ADO перестает видеть ошибки, происходящие ПОСЛЕ этого селекта. Err = 0, Errors collection пустая.

В MSDN рекомендуют либо ставить set nocount on, либо использовать ODBC драйвер вместо OLEDB'шного. НИ ТО, НИ ДРУГОЕ НЕ ПОМОГАЕТ.

Люди! Ведь среди вас дофига народу, который использует ADO. Не верю, что вы не сталкивались с подобной ситуацией!
-------------------------------------------------------------------------
SQL-DMO в таком скрипте ошибку выдает, равно как и чистый OLEDB.
...
Рейтинг: 0 / 0
ADO & errors
    #32026870
Фотография Chicago
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно коллекция Errors пустая? Собственно, ADO действительно не всегда приводит к возникновению ошибки в коде на VB и VBScript. Но я еще не сталкивался с ситуацией, когда при этом еще и коллекция Connection.Errors была пуста.

ADO использую регулярно, начиная с самых первых версий.
...
Рейтинг: 0 / 0
ADO & errors
    #32026873
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зуб даю, пустая. И Err.Number = 0.

Тест простейший - прогони и убедись. Все приведено в первом сообщении. Если сделаешь это, пожалуйста, напиши о результатах.
...
Рейтинг: 0 / 0
ADO & errors
    #32026886
nic_ii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал через ADODB.Command:

Set cmd = CreateObject("ADODB.Coommand")
Set rc = CreateObject("ADODB.Parameter")
Set cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp1"
rc.Direction = adParamReturnValue
rc.Type = adInteger
cmd.Parameters.Append rc
cmd.Execute
if rc.Value < 0 Goto Error_handling

все вроде-бы работает - выдает rc.Value = -4 при возникновении ошибки...
...
Рейтинг: 0 / 0
ADO & errors
    #32026888
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оно ошибки (а также результат оператора PRINT) шлет пустым (хотя и специальным) рекордсетом. Если возвращается выборка оператором SELECT, то эти ошибки (возникшие после SELECT) - следующие наборы данных после выборки. Можно попытаться их поймать через NextRecordset. А без NextRecordset ADODB.Recordset считывает только первую выборку, а дальше ничего не фетчит сам. Соответственно, и ошибки до него не доходят.
...
Рейтинг: 0 / 0
ADO & errors
    #32026893
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 nic_ii: спасибо, с command'ом попробую, пока руки не дошли.

2 Dankov: а зачем тогда коллекция Errors? И по какому принципу она то заполняется, то нет? Встречный вопрос (если твоя информация верна) - каким образом отличать рекордсет, содержащий данные, от рекордсета, содержащего ошибки?
--------------------------------------------------------
Вопрос в никуда - почему в MSDN ничего на эту тему нет?! Такие вещи должны быть выбиты здоровенными буквами. Или у меня глаза в кармане... Может, кто пальцем ткнет?
--------------------------------------------------------
Все, иду проверять ваши версии. Спасибо откликнувшимся
О результатах напишу.
...
Рейтинг: 0 / 0
ADO & errors
    #32026913
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>а зачем тогда коллекция Errors?

У меня нету ответа на этот вопрос.

> каким образом отличать рекордсет, содержащий данные, от рекордсета, содержащего ошибки?

В Делфи, например, TADODataSet отличает так:

while Recordset.State = adStateClosed do
begin
FRecordsetObject := Recordset.NextRecordset(VarRecsAffected);
end;

т.е. по состоянию adStateClosed. Как только в процессе перебора рекордсетов наткнулся на рекордсет, не имеющий это состояние, то это будет рекордсет с данными.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADO & errors
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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