【问题标题】:adapter.Update first goes to the Rowupdated event before going into the catch blockadapter.Update 在进入 catch 块之前首先进入 Rowupdated 事件
【发布时间】:2018-04-17 12:29:25
【问题描述】:

我有 SqlDataAdapter 的代码

adapter.RowUpdated += adapter_RowUpdated;
try
{
    try
    {
      adapter.Update(Table);
      trans.Commit();
    }
    catch (Exception ex)
    {
       trans.Rollback();
       throw new Exception(ex.Message);
    }
}
finally
{
    adapter.RowUpdated -= adapter_RowUpdated;
}

这是我的 Rowupdated 事件

void adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
    if (e.StatementType == StatementType.Insert)
    {
       object ai = e.Command.Parameters["@SCOPE_ID"].Value;
       e.Row[_IdentityFieldName] = ai;
    }
}

这已经运行了一年多。
但有时我在插入时遇到异常“列xxxID不能为空”,所以我对其进行了调试,问题是当adapter.Update(table)fails(例如因为违反了检查约束)下一行代码不是Catch代码,但它首先进入 RowUpdated 事件。
在那种情况下,当然会发生一个新的异常,即 _IdentityFieldName 不能为空(它包含表的主字段的名称,这是一个身份字段)

只有在那之后才进入catch,但那时原始异常从check constraint violated替换为column cannot be null

当我运行/调试时会发生以下情况

应用程序在adapter.Update(table) 处中断,但有异常

INSERT 语句与 CHECK 约束冲突 “CK_PrijsAankoop”。数据库“GTT_Test”表中发生冲突 "dbo.tblOpdrachtCar

现在我希望它进入 catch,但它首先进入 adapter_RowUpdated 事件,然后在 e.Row[IdentityFieldName] = ai; 行上抛出另一个异常

OpdrachtCarID' 不允许空值

现在它终于进入了 catch 块,但是这个异常现在不再是原来的异常了!

所以我的问题是,我怎样才能强制 dotnet 进行正确的异常处理并直接进入 catch 而不是先去这个事件?

【问题讨论】:

    标签: c# .net winforms exception-handling ado.net


    【解决方案1】:

    这是设计使然。 RowUpdated 将在尝试更新行后引发,无论成功失败。事实上,RowUpdated 对于响应更新过程中出现的错误和异常特别有用。

    事件的事件参数SqlRowUpdatedEventArgs 有一个Errors 属性,您可以使用它来获取行更新期间发生的错误。

    您可以使用事件参数的Status 属性检查执行状态:

    if (e.Status == UpdateStatus.ErrorsOccurred)  
    {  
        //An error occurred
    }  
    

    要了解有关 DataAdapter 事件的更多信息,请查看Handling DataAdapter Events

    【讨论】:

    • 好的,所以我可以使用它来知道发生了错误,并且在发生错误时不执行我的代码。谢谢
    • 除了答案之外,我应该提到,更新Identity 列值,可以通过输出参数或 SELECT 命令自动完成。要查看它是如何完成的,请使用 Data Source Window 在您的项目中创建一个DataSet,然后在设计器中打开数据集并单击表适配器并查看 INSERT 命令。它的末尾有一个SELECT * FROM YourTable WHERE (Id = SCOPE_IDENTITY())
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多