Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
Народ, я понимаю, что эта тема навязла в зубах. Но никто так и не дал на нее удовлетворительного ответа. Почему 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2002, 08:56 |
|
||
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
А точно коллекция Errors пустая? Собственно, ADO действительно не всегда приводит к возникновению ошибки в коде на VB и VBScript. Но я еще не сталкивался с ситуацией, когда при этом еще и коллекция Connection.Errors была пуста. ADO использую регулярно, начиная с самых первых версий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2002, 11:21 |
|
||
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
Зуб даю, пустая. И Err.Number = 0. Тест простейший - прогони и убедись. Все приведено в первом сообщении. Если сделаешь это, пожалуйста, напиши о результатах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2002, 11:27 |
|
||
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
Попробовал через 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 при возникновении ошибки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2002, 13:23 |
|
||
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
Оно ошибки (а также результат оператора PRINT) шлет пустым (хотя и специальным) рекордсетом. Если возвращается выборка оператором SELECT, то эти ошибки (возникшие после SELECT) - следующие наборы данных после выборки. Можно попытаться их поймать через NextRecordset. А без NextRecordset ADODB.Recordset считывает только первую выборку, а дальше ничего не фетчит сам. Соответственно, и ошибки до него не доходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2002, 13:35 |
|
||
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
2 nic_ii: спасибо, с command'ом попробую, пока руки не дошли. 2 Dankov: а зачем тогда коллекция Errors? И по какому принципу она то заполняется, то нет? Встречный вопрос (если твоя информация верна) - каким образом отличать рекордсет, содержащий данные, от рекордсета, содержащего ошибки? -------------------------------------------------------- Вопрос в никуда - почему в MSDN ничего на эту тему нет?! Такие вещи должны быть выбиты здоровенными буквами. Или у меня глаза в кармане... Может, кто пальцем ткнет? -------------------------------------------------------- Все, иду проверять ваши версии. Спасибо откликнувшимся О результатах напишу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2002, 14:43 |
|
||
|
ADO & errors
|
|||
|---|---|---|---|
|
#18+
>а зачем тогда коллекция Errors? У меня нету ответа на этот вопрос. > каким образом отличать рекордсет, содержащий данные, от рекордсета, содержащего ошибки? В Делфи, например, TADODataSet отличает так: while Recordset.State = adStateClosed do begin FRecordsetObject := Recordset.NextRecordset(VarRecsAffected); end; т.е. по состоянию adStateClosed. Как только в процессе перебора рекордсетов наткнулся на рекордсет, не имеющий это состояние, то это будет рекордсет с данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 06:54 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32026886&tid=1823243]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 262ms |
| total: | 373ms |

| 0 / 0 |
