Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Обработка ошибок ADO   Найти похожие ветки 

 
chexum   (2003-07-02 15:53) [0]

У меня на таблице висит триггер на обновление и хранимая процедура, которая делает обновление в таблице.
И в триггере и в процедуре выполняется RAISERROR.
Если запустить процедуру в Query Analyzer, то он выводит результат обоих RAISERROR. Усли запустить из Delphi (ADOStoredProc), то выводится сообщение только первого RAISERROR.
Подскажите, как получить список всех ошибок?

На всякий случай код:

CREATE TRIGGER u_test ON dbo.test
FOR UPDATE
AS
BEGIN
RAISERROR ("error in trigger u_test", 16, 1)
END


CREATE PROCEDURE sp_test AS
BEGIN
UPDATE test SET test=""
IF (@@ERROR <> 0) RAISERROR ("error in procedure sp_test", 16, 1)
END


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
try
ADOStoredProc.ExecProc;
except
for i := 0 to AdoConnection.Errors.Count-1 do
ShowMessage(AdoConnection.Errors[i].Description);
end;
end;


Если выполнить в QA, то получаю:
Server: Msg 50000, Level 16, State 1, Procedure u_test, Line 5
error in trigger u_test

(3 row(s) affected)

Server: Msg 50000, Level 16, State 1, Procedure sp_test, Line 4
error in procedure sp_test


 
sniknik ©   (2003-07-02 15:59) [1]

есть список ADOConnection1.Errors[] но не всегда заполняется, при локальных курсорах список не передается.


 
chexum   (2003-07-02 16:15) [2]

to sniknik
> есть список ADOConnection1.Errors[]
Я в клиенте просматриваю Errors, но там только первая ошибка.
> при локальных курсорах список не передается
ты имеешь ввиду CursorLocation = clUseClient?


 
sniknik ©   (2003-07-02 16:31) [3]

> ты имеешь ввиду CursorLocation = clUseClient?
ага, поставь везде clUseServer. поэксперементируй.


 
chexum   (2003-07-02 17:08) [4]

Поэкспеременитровал. Результат тот же :(
Какие еще идеи будут?


 
sniknik ©   (2003-07-02 18:09) [5]

но одну ошибку видиш? значит почти правильно :о))

попробуй для каждого рекордсетя получать список (возможно они в разных возвращаются)
типа


Recordset: _Recordset;
V: OleVariant;
begin
st:= RichEdit1.Lines.GetText;

Recordset:= ADOConnection1.Execute(st);
while not (stOpen in ADOConnection1.State) do;

for i:= 0 to ADOConnection1.Errors.Count-1 do
Memo1.Lines.Add(ADOConnection1.Errors[i].Description);

Recordset:= Recordset.NextRecordset(V);
for i:= 0 to ADOConnection1.Errors.Count-1 do
Memo1.Lines.Add(ADOConnection1.Errors[i].Description);


и так до тех пор пока NextRecordset не вернет ошибку (коней рекордсетам)


 
sniknik ©   (2003-07-02 18:10) [6]

:))) коней = конец (а то ускачут нафиг :о))))


 
chexum   (2003-07-03 10:10) [7]

NextRecordset сразуже вернул ошибку. Выходит, только один рекордсет есть?
и еще вопрос:
while not (stOpen in ADOConnection1.State) do;
Для чего это надо?


 
sniknik ©   (2003-07-03 12:35) [8]

> NextRecordset сразуже вернул ошибку. Выходит, только один рекордсет есть?
смотря какая ошибка. вобще то если множественный рекордсет поддерживается (MSSQL) и их там несколько ошибки быть не должно (это я ошибся :-(, у меня разные провайдеры и обрабатываю "в общем" nil в except присваиваю дальше по нему проверка) в случае с MSSQL просто на возврат nil надо проверку ставить.


> while not (stOpen in ADOConnection1.State) do;
> Для чего это надо?
ждет пока запрос не завершится, (при серверном курсоре или асинхронном запросе, лутше конечно событие обрабатывать.)

попробуй (если события не возникают то курсор не тот)

procedure TForm1.ADOConnection1InfoMessage(Connection: TADOConnection;
const Error: Error; var EventStatus: TEventStatus);
begin
Memo1.Lines.Add(Error.Description);
end;

procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
begin
Memo1.Lines.Add(Error.Description);
end;



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
3-77783
OlkaGTS
2003-07-01 17:22
2003.07.24
Delphi + поля объекта OLE в MS Access


1-77875
Дома
2003-07-13 23:08
2003.07.24
2 вопроса (RichEdit и TabControl)


1-77922
Сергей Ч
2003-07-10 14:34
2003.07.24
Установил Delphi7


1-77859
Officeman
2003-07-10 21:43
2003.07.24
TListView


14-78137
Nikkk
2003-07-08 23:07
2003.07.24
Домашняя cеть в WinME