![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка ошибок ADO [D7, MSSQL, ADO]
chexum © (2003-07-02 15:53:00)У меня на таблице висит триггер на обновление и хранимая процедура, которая делает обновление в таблице.
И в триггере и в процедуре выполняется 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-03 12:35:00) [1]> 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;
chexum (2003-07-03 10:10:00) [2]NextRecordset сразуже вернул ошибку. Выходит, только один рекордсет есть?
и еще вопрос:
while not (stOpen in ADOConnection1.State) do;
Для чего это надо?
sniknik (2003-07-02 18:10:00) [3]:))) коней = конец (а то ускачут нафиг :о))))
sniknik (2003-07-02 18:09:00) [4]но одну ошибку видиш? значит почти правильно :о))
попробуй для каждого рекордсетя получать список (возможно они в разных возвращаются)
типа
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 не вернет ошибку (коней рекордсетам)
chexum (2003-07-02 17:08:00) [5]Поэкспеременитровал. Результат тот же :(
Какие еще идеи будут?
sniknik (2003-07-02 16:31:00) [6]> ты имеешь ввиду CursorLocation = clUseClient?
ага, поставь везде clUseServer. поэксперементируй.
chexum (2003-07-02 16:15:00) [7]to sniknik
> есть список ADOConnection1.Errors[]
Я в клиенте просматриваю Errors, но там только первая ошибка.
> при локальных курсорах список не передается
ты имеешь ввиду CursorLocation = clUseClient?
sniknik (2003-07-02 15:59:00) [8]есть список ADOConnection1.Errors[] но не всегда заполняется, при локальных курсорах список не передается.