Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обработать ошибки выдаваемые при выполнении SQL-оператора? [D6, DB2 v6]


Neposeda ©   (2002-10-15 13:45:00) 

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

Спасибо! Алексей.


Neposeda   (2002-10-16 09:08:00) [1]

Всем Огромное Спасибо за ответы!
Алексей.


Alinka   (2002-10-15 17:08:00) [2]

Procedure ObrabotchicErrorov(E:EDatabaseError;{E: EDBEngineError;}UpdateKindSTR: string;Pole:string);
var
s:string;
PartCat,PartCode:word;
sp:Pchar;
UKSTR:string;
function OriginalMessage: String;
var I: Integer; DBErr: TDBError; S: String;
begin
if E is EDBEngineError then
begin
Result := #13#10 ;
for I := 0 to EDBEngineError(E).ErrorCount - 1 do
begin
DBErr := EDBEngineError(E).Errors[I];
case DBErr.NativeError of
-836: { Intebase exception }
begin
S := DBErr.Message;
Result := #13#10 + Copy(S, Pos(#10, S) + 1, Length(S));
Exit;
end;
end;
S := Trim(DBErr.Message);
if S <> "" then Result := Result + #13#10 + S;
end; end;
OriginalMessage :=Result;
end;
{********************}
begin
UKSTR:=UpdateKindSTR;
case EDBEngineError(E).Errors[0].ErrorCode of
(* $2204: E.Message := "aaaaa"{LoadStr(SKeyDeleted);};
$271E,$2734: E.Message := "bbbbbbbb"{LoadStr(SInvalidUserName);};
$2815: E.Message := "cccccccccc"{LoadStr(SDeadlock);};*)
(* $2604: E.Message :={ LoadStr(SFKViolation) + }"wwww"+OriginalMessage;*)
13059:
begin
E.Message:="У вас отсутствуют права на изменение даной таблицы."{+OriginalMessage};
end;
$2601:
begin
if UKSTR="ukDelete" then E.Message:="Удалить запись нельзя так как это повлечет нарушение целостности базы данных."{+OriginalMessage};
if ((UKSTR="ukInsert")) then
E.Message:="Изменения сохранить нельзя так как нарушается условие уникальности поля ""+Pole+"""{+OriginalMessage};
if ((UKSTR="ukModify")) then
begin
if Pos("Btrieve Error 5", OriginalMessage)<>0 then
E.Message:="Изменения сохранить нельзя, так как нарушается условие уникальности поля ""+Pole+"""{+OriginalMessage};
if Pos("Btrieve Error 71", OriginalMessage)<>0 then
E.Message:="Изменения сохранить нельзя, так как это повлечет нарушение целостности базы данных."{+OriginalMessage};
{дублирование значений полей в уникальном ключе}
end;
end;
else
begin
E.Message := (*Format(LoadStr(6{SErrorCodeFmt}), [EDBEngineError(E).Errors[0].ErrorCode]) +*)OriginalMessage;
end; end;
Application.MessageBox(PChar(E.Message),"Сообщение",MB_OK);
end;


passm   (2002-10-15 16:15:00) [3]

Neposeda (15.10.02 13:45)> Ошибки SQL - оператора не могут привести к "вываливанию" из программы, если она написана без "экзотики"! Обычный DBException.


Johnmen   (2002-10-15 15:58:00) [4]

>gek © (15.10.02 15:43)

Да-да !!! Пусть жмет !


gek   (2002-10-15 15:43:00) [5]

> Johnmen © (15.10.02 15:39)

Он видимо хочет примерно так

TRY
Query1.ExecSQL;
EXCEPT
on E:Exception do
begin
ShowMessage(E.message);
Exit;
end;


Johnmen   (2002-10-15 15:39:00) [6]

Нет ли желания нажать F1 на try ?


Neposeda   (2002-10-15 15:27:00) [7]

А как правильно интерпритировать ошибку, т.е. при вашем способе любая ошибка опишется сообщением "ОШИБКА", вне зависимости есть ли коннект, синтаксическая ошибка, либо двойник примарикей.
Хотелось бы сообщать более конкретную ошибку, путем обработки SQL кода ошибки.


AM   (2002-10-15 14:45:00) [8]

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(ick);
TRY
Query1.ExecSQL;
EXCEPT
ShowMessage("ОШИБКА!");
Exit;
END;

ShowMessage("Все хорошо!");


Neposeda   (2002-10-15 14:35:00) [9]

А по подробней можно:
Вот я пишу в программе:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(ick);
Query1.ExecSQL;


ick-строка SQL-оператора.


Johnmen   (2002-10-15 14:08:00) [10]

try ...


neXt   (2002-10-15 13:46:00) [11]

код ошибки хранится в @@error если это MS2000


Наверх

Титульная страница Поиск, карта сайта Написать письмо