2012-04-19 3 views
0

У меня есть приложение, связанное с базой данных.
Подключено с использованием компонентов BDE и базы данных MySQL.Delphi найти конкретную причину для исключения

Теперь я делаю некоторые проверки для проверки того, выполняется ли повторяющаяся запись при выполнении инструкции insert.

Ниже приведен код для проверки дублирующей записи для атрибута первичного ключа.

var 
    error :string; 
    cmpres:integer; 
begin 
... 
/* all my data queries */ 
    try 
    Query1.ExecSQL; 
    Except 
    on E: Exception do 
    /*check if its a Duplicate entry or other exception*/ 
    begin  
     error := E.Message; 
     error := copy(error,length(error)-16,length(error)-2); 
     cmpres :=CompareStr(LowerCase(error),'for key '+#39+'primary'+#39) ; 
     if cmpres = 0 then 
      MessageDlg('Entry already exist',mtError,[mbok],0) 
     else 
      MessageDlg('Invalid Data Entries',mtError,[mbok],0); 
     exit; 
    end; 
    end; 
end; 

Исключение базы данных широко помещено внутрь EDatabaseError

Может кто-нибудь сказать мне, есть ли способ, я могу различать эти ошибки, не делая сравнения сообщений.
Заранее спасибо

+0

Что говорит вам отладчик? –

+0

@DavidHeffernan Отладчик дает мне это сообщение об ошибке 'ошибка 'Нарушение ключа.' # $ D # $ A '[MySQL] [ODBC 5.1 Driver] [mysqld-5.5.11] Дублирующая запись' '64' 'для ключа' ' PRIMARY '' '' ' – Shirish11

+0

Нет, я имею в виду, что ** класс ** является ошибкой и какие свойства предлагает этот класс. –

ответ

1

Если вы используете BDE, исключения должны быть EDBEngineError, а не EDatabaseError. Вы можете сделать это:

try 
    Query1.ExecSQL; 
except 
    on E: EDBEngineError do 
    begin 
     for i := 0 to E.ErrorCount - 1 do 
     begin 
      err := E.Errors[i]; 
      case err.ErrorCode of 
       ... stuff ... 
      end; 
     end 
    end; 
end 
+0

это применимо для других компонентов БД и баз данных? – Shirish11

+0

Похож на это. Вы должны быть в состоянии проверить довольно легко, делая (если E является EDBEngineError), то ... – JamesT

Смежные вопросы