2012-04-15 4 views
3

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

try 
(enter code) 
except on E: EDatabaseError do 
showmessage (Error message); 
end; 

, но я хотел бы конкретно ответить на ключевое нарушение, он использует таблицу доступа с помощью ADO.

+1

Что конкретно определяет исключение, которое вы хотите ловушку? –

+0

, когда я добавляю нового клиента в свою систему с идентификатором клиента (первичный ключ), который уже существует, и возвращается следующее сообщение: - повышен класс исключений EOleException с сообщением «Изменения, которые вы запросили в таблице, не были успешными, потому что они создайте повторяющиеся значения в индексе, первичном ключе или связи ' – Alexjjsmith

+0

, тогда, если я снова запустил то же сообщение, но с EDatabaseError вместо EOleException – Alexjjsmith

ответ

7

Это будет работать, если только ошибка Вы желаете обрабатывать это один с сообщением «дубликат значения»:

try 
    // Your code 
except 
    on E: EOleException do 
    begin 
    // The better way is to find out what E.ErrorCode is 
    // for this specific exception, and handle it instead 
    // of checking the string - you didn't provide the 
    // ErrorCode, though. 
    // If E.ErrorCode = <whatever> then 
    // 
    if Pos('duplicate value', E.Message) > 0 then 
     // You've got a duplicate with the message above 
     // Do whatever handles it 
    else 
     raise; 
    end; 
    // If you want to handle other exception types (eg., EDataBaseError), 
    // you can do so here: 
    // on E: EDataBaseError do 
    // HandleDBError; 
end; 
+0

Возможно ли, что локализация может привести к сбою в неанглийских системах? Просто мысль! Кроме того, ваш код проглатывает все исключения EOleException. –

+0

Только что обновил мой ответ, чтобы обеспечить лучшее решение, которое не имеет этой проблемы. См. Комментарии над линией 'Pos'. :) –

+0

как я могу найти код ошибки? – Alexjjsmith

3

Из вашего описания, это не звучит как-то, что вы должны пусть доходит до исключения. Особенно, если все, что вам нужно, это EOleException. Исключения должны быть из-за того, что у вас нет хорошего способа справиться, и здесь это не так.

Я предлагаю вам проверить, что новый идентификатор еще не используется, прежде чем пытаться добавить новую запись. Или, как предлагает @TLama, воспользуйтесь любыми средствами обработки ошибок в вашей инфраструктуре базы данных, которые позволяют вам подключить это, прежде чем оно станет исключением.

+0

@ken транзакции имеют дело с 2, и у вас есть точка в 1. Возможно, перфомант - это слишком большая проблема. Я думаю со стороны программирования, а не с точки зрения db. –

+0

Но это, скорее всего, будет * уловлено * в некоторых случаях управления передачей данных БД. – TLama

+0

@TLama, неважно, где его поймают. Его все еще нужно поймать. –

6

EDatabaseError только общий класс excption без дополнительной информации об ошибке, чтобы получить расширенную информацию об ошибке в ADO, необходимо использовать TADOConnection.Errors свойства, чтобы получить, специфический код ошибки, когда поднято Key violation исключения, для этого проверьте Number и NativeError.

Вы можете нашли больше документации об этой теме здесь

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