В клиентской части ADO.NET, где отлавливать ошибки, возникающие в FOR INSERT, триггер UPDATE в серверной части - PullRequest
0 голосов
/ 23 сентября 2019

Как правильно в 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>
...