Форум: "Базы";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизОбработка ошибок 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c