Конференция "Базы" » ADODB Errors - не все ошибки возврщаются
 
  • ТимоховДА (24.01.15 19:26) [0]
    Коллеги!

    Прошу помощи.

    1. Ситуация

    Есть некий батч, в котором я выполняю некоторые проверки.

    Перед каждой проверкой я делаю PRINT N, где N - номер проверки.

    Если выполнять скрипт по Query Analizer'е, то все эти N возвращаются.

    По идее, они должны были и в ADODB.Errors попасть, если код выполнять под Delphi. Но попадают не все. Первая точно попадает. Если дальше где-то вызвать RAISERROR, то и он попадет, но только первый RAISEERROR.

    2. Вопрос.

    Сталкивался ли кто-то с такой особенностью ADODB и что с этим делать?

    Спасибо.

    PS. Delphi 2007, MSSQL 2000, ADODB 2.8, WinXPSP3
  • sniknik © (24.01.15 21:04) [1]
    PRINT это не ошибка, сообщение, ну или вернее ошибка (по исполнению) с низким приоритетом. показывается только при определенных условиях (серверный курсор).

    > но только первый RAISEERROR.
    после raise в дельфе тоже код не выполняется... ну без определенных условий.

    > и что с этим делать?
    смирится и учить и привыкать как оно работает по умолчанию или углубленное изучение ADO и переписывать много много кода. например грид нельзя в некоторых случаях использовать... не работает при условиях работы PRINT-а.
  • junglecat © (24.01.15 21:54) [2]
    > Есть некий батч

    заведи в этом батче переменную, куда пиши результаты своих проверок. Потом возвращай как out-параметр, например
  • ТимоховДА (24.01.15 23:39) [3]
    1. RAISERROR не прекращает выполнение.

    код
    declare @r table(i int)
    raiserror('error', 0, 1)
    insert @r values(1)
    select * from @r


    выводит

    error
    col
    1


    тогда как
    declare @r table(col int)
    raiserror('error', 0, 1)
    return
    insert @r values(1)
    select * from @r


    выводит
    error



    Причем как в QA, так и в ADO

    2. Тогда такой вопрос: почему QA показывает и несколько print'ов и несколько raiserror'ов?
    а) Варианты ответов, т.к. QA работает через ODBC и там иной подход к обработке ошибок.
    б) Свой вариант.

    ЗЫ Гридом не пользуюсь. Пользуюсь только ADODB, когда-то импортировал с тех пор и пользуюсь.
  • ТимоховДА (24.01.15 23:43) [4]

    > junglecat ©   (24.01.15 21:54) [2]
    > > Есть некий батч
    > заведи в этом батче переменную, куда пиши результаты своих
    > проверок. Потом возвращай как out-параметр, например


    Я сейчас поставил себе задачу раз и навсегда разобраться с темой: return, raiserror, rollback. В дельфи был простой топик в справке, который внятно разъяснял, как идет выполнение кода, как на него влияет goto, exit, try, finally, break, continue и т.д.

    Я как бы всегда (15 лет) писал только отчетные запросы или для изменения пользовался уже готовыми сохр. процедурами. Пришло время разобраться с интересуемой темой.

    Т.е. как-бы уже больше вопрос не практический, а больше по изучению темы.

    ЗЫ Всегда можно что-то вернуть select'ом. Это я понимаю.
  • sniknik © (24.01.15 23:51) [5]
    > 1. RAISERROR не прекращает выполнение.
    > ну или вернее ошибка (по исполнению) с низким приоритетом.
    у тебя пример не эксепта, а фактически аналога PRINT
    вот так проверь
    raiserror('error', 16, 1)
  • ТимоховДА (25.01.15 00:10) [6]

    > sniknik ©   (24.01.15 23:51) [5]
    > > 1. RAISERROR не прекращает выполнение.
    > > ну или вернее ошибка (по исполнению) с низким приоритетом.
    > у тебя пример не эксепта, а фактически аналога PRINT
    > вот так проверь
    > raiserror('error', 16, 1)


    Прекрасно! Мы подошли к вопросу, который я не понимаю.

    Если код выполнить в QA:

    create table qwerty(col int)
    raiserror('error', 16, 1)
    insert qwerty values(1)
    select * from qwerty



    то вывод будет

    Server: Msg 50000, Level 16, State 1, Line 2
    error
    col
    1



    Если же под ADO, то будет просто исключение с текстом error и ничего не вернется. Для получения RS в ADODB я пользуюсь ADODB.Comman.Fetch - т.е. Fetch свалился по исключению, есно рез-т не вернет.

    Но!
    insert qwerty values(1)


    выполнился!

    Т.е. raiserror не прерывает выполнение. Подозреваю, что ты не прав, что raiserror с severity 16 прерывает выполнение. Просто ошибки накапливаются и в конце батча, если есть 16, то генерится исключение. Думаю, что так.

    Если вернуться к исходному вопросу, то по идее ADODB.Connection.Errors должны накапливать как PRINT'ы, так и RAISERROR'ы.
    А по факту накапливают не верно.
    Может сталкивался именно с таким поведением?
    Или вообще методика возврата гнилая?

    Ладно, наверное, вопрос снимаю. Надо еще подумать в связи с открывшимся пониманием новых моментов.
  • sniknik © (25.01.15 00:19) [7]
    > Т.е. raiserror не прерывает выполнение.
    странно... но может быть, может не помню.

    > по идее ADODB.Connection.Errors должны накапливать как PRINT'ы, так и RAISERROR'ы.
    они накапливаются, в зависимости он настроек, писал выше. + попробуй к полученному рекордсету применить NextRecordset.
    может прерывается получение списка а не выполнение на сервере.
  • ТимоховДА (25.01.15 02:12) [8]

    > sniknik ©   (25.01.15 00:19) [7]


    Я решил применить народную мудрость - от добра добра не ищут.
    Нехилый проект работал 15 лет, обрабатывал ошибки и все было ок.
    Тут что-то взбрело усовершенствовать)))

    Буду, как и раньше, считать все исключения из ADODB ошибками, причем одиночными, а не набором данных всяких сообщений.

    Буду по-старинке. "Это у меня манера такая", как говорил Никулин в к/ф "Когда деревья были большими".

    Всем спасибо!
  • junglecat © (25.01.15 11:16) [9]
    begin try
     create table qwerty(col int)
     raiserror('error', 16, 1)
     insert qwerty values(1)
     select * from qwerty
    end try
    begin catch
     print 'error raised'
    end catch
  • sniknik © (25.01.15 17:14) [10]
    junglecat ©   (25.01.15 11:16) [9]
    о, точно, при правильном коде все логично работает. а без try (ТимоховДА   (25.01.15 00:10) [6]) действительно не прерывает, проверил.
 
Конференция "Базы" » ADODB Errors - не все ошибки возврщаются
Есть новые Нет новых   [134427   +34][b:0][p:0.002]