【发布时间】: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