Как правильно в ADO.NET обнаруживать ошибку, возникающую в SQL Server триггер (в отличие от хранимой процедуры)?
A FOR INSERT,UPDATE
триггер вСерверная часть SQL Server 2017 обнаруживает состояние ошибки приложения (перекрывающееся расписание, которое не допускается) и выполняет RAISERROR
и откат транзакции:
begin
raiserror('Overlapping schedule',16,1)
rollback transaction
end
Этот триггер работает правильно,Вставки и обновления в SSMS, которые создают состояние ошибки, правильно обнаружены.
Overlapping schedule
Msg 3609, Level 16, State 1, Line 5
The transaction ended in the trigger. The batch has been aborted.
Но в коде ADO.NET внешнего интерфейса эта ошибка не обнаруживается .Действие DML должным образом предотвращается в бэкэнде, но код ADO.NET не сообщает об ошибке: SqlRowUpdatingEventArgs
в RowUpdating
событии SqlDataAdapter
и SqlRowUpdatedEventArgs
в адаптере RowUpdated
оба события показывают состояние UpdateStatus.Continue
, а не UpdateStatus.ErrorsOccurred
.
void DA_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
{
if (e.Status == UpdateStatus.ErrorsOccurred)
{
e.Row.RowError = e.Errors.Message;
e.Status = UpdateStatus.SkipCurrentRow;
throw new Exception(e.Errors.Message);
}
<snip>
}
void DA_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
try
{
if (e.Status == UpdateStatus.ErrorsOccurred)
{
var ex = new Exception(e.Errors.Message);
throw ex;
}
<snip>