2016-09-12 2 views
1

Я пытаюсь настроить собственное сообщение об ошибке для перехода к MS Access (из SQL Server), когда пользователь вводит дубликат (вместо системного сообщения 2627). Я читал о блоках sp_addmessage и RAISERROR и TRY/CATCH, которые все имеют смысл. Но нигде я не посмотрел, кажется ли, что вы указываете, где вы поместите код RAISERROR (и блок TRY/CATCH), чтобы он действительно перешел обратно к приложению. Итак, куда идет код?Где вы помещаете код SQL RAISERROR?

+2

RAISEERROR() - это функция sql. Вы вызываете это, когда есть ошибка, которую вы хотите вернуть. Вам не нужно инкапсулировать его в хранимую процедуру. Он уже доступен для использования там, где вы хотите его использовать. –

+0

@StevenMays, я вижу. Я все еще не знаю, куда поместить мой код, который использует RAISERROR. – Rominus

+0

Вам не нужен RAISERROR. Используйте обработчик ошибок в VBA для отображения значимого сообщения. Вот пример: https://social.msdn.microsoft.com/Forums/office/en-US/77c6075b-e18c-4598-a9d4-db2a91e8270c/trap-error-in-access-form-linked-to-sql -server-table? forum = accessdev – Andre

ответ

4

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

Когда пользователь вводит ключ, выполняется инструкция SQL INSERT. Если ключ является дубликатом, и у вас есть ограничения, определенные в таблице, чтобы предотвратить это, оператор INSERT терпит неудачу. Если в вашем приложении Access вы пишете собственный SQL, вы можете обернуть его в TRY/CATCH и поместить RAISERROR в блок CATCH. Если ваше приложение Access таково, что вы никогда не увидите SQL, вы можете застрять, и вам придется смириться со встроенным поведением.

+0

Я запускаю приложение на бэкэнд SQL Server, который я сам разрабатываю, так что да, я пишу SQL. Если я правильно прочитаю ваш ответ, я бы поставил TRY/CATCH в ограничение в коде таблицы? То есть в инструкции CREATE TABLE? – Rominus

+0

Отрицательный @Rominus, вы положили бы его в инструкцию INSERT. – scsimon

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