Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADO & errors / 7 сообщений из 7, страница 1 из 1
03.04.2002, 08:56
    #32026842
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO & errors
Народ, я понимаю, что эта тема навязла в зубах. Но никто так и не дал на нее удовлетворительного ответа. Почему 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
03.04.2002, 11:21
    #32026870
Chicago
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO & errors
А точно коллекция Errors пустая? Собственно, ADO действительно не всегда приводит к возникновению ошибки в коде на VB и VBScript. Но я еще не сталкивался с ситуацией, когда при этом еще и коллекция Connection.Errors была пуста.

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

Тест простейший - прогони и убедись. Все приведено в первом сообщении. Если сделаешь это, пожалуйста, напиши о результатах.
...
Рейтинг: 0 / 0
03.04.2002, 13:23
    #32026886
nic_ii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO & errors
Попробовал через 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
03.04.2002, 13:35
    #32026888
Dankov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO & errors
Оно ошибки (а также результат оператора PRINT) шлет пустым (хотя и специальным) рекордсетом. Если возвращается выборка оператором SELECT, то эти ошибки (возникшие после SELECT) - следующие наборы данных после выборки. Можно попытаться их поймать через NextRecordset. А без NextRecordset ADODB.Recordset считывает только первую выборку, а дальше ничего не фетчит сам. Соответственно, и ошибки до него не доходят.
...
Рейтинг: 0 / 0
03.04.2002, 14:43
    #32026893
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO & errors
2 nic_ii: спасибо, с command'ом попробую, пока руки не дошли.

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

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

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

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

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

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


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