日期:2014-05-19  浏览次数:20803 次

偶再来提个问题--如何忽略更新行数为0的异常?
数据库中有两个表:TBLmaster和TBLdetail,这两个表格是主从表,内部有主外健强制更新和删除的逻辑关系。
建立强DataSet类型,对这两个表格对应Adapter也设置了主从关系,并且也设置了“外键和关系”,支持强制更新和删除。
问题来了,如果从数据库加载到DataSet的一批数据,把主记录给删除了,根据DataSet类的关系,明细记录自然也删除。现在调用Adapter.Update去保存,主表是可以正常Update的,但是从表却会报出一个“更新记录为0”(大义如此)的异常。
更新代码为:
    tblMasterAdapter.Update(dataset.TBLMaster);
    tblDetailAdapter.Update(dataset.TBLDetail);
分析了一下,这个异常抛出是正常的,因为DataSet中的主表记录一删除后,DataSet中的从表记录自然也标记为删除。然而把DataSet的主表更新记录更新到数据库时(实际是删除),数据库根据主从表的设定,把明细表记录也物理删除了,最后当把DataSet的明细表更新也应用到数据库时(同样,实际也是删除),数据已经没了,当然返回更新0条而不是预期的1条。

    我想问问大家,如何屏蔽此类错误呢?因为有的时候,即使因为条件不满足而没有更新数据库的实际行为发生,不能说都是错,在有些环境下属于正常的(比如删除日志)。
    当然这里有个办法,就是数据库的强制更新和强制删除关系去掉。但是我不想这样,因为,数据库自成体系的,不能因为开发语言的限制或者不足改妥协。我也不想在DataSet上去掉这个外键强制删除关系,否则都要在删除主记录后,必须再编写删除从表记录的代码--这些都是比较啰唆的!

      以前在开发Delphi的时候,ApplyUpdates有参数可以指示更新是否成功,比如说-1接收所有的更新结果(含义就是即使更新没有实际发生也当作成功),而非-1的N则要求更新实际发生的行数必定也是N,否则就抛异常。
      想念Delphi!
      各位朋友,有好的解决方法吗?

------解决方案--------------------
太多了没看,呵呵
try
{
update语句;
}
catch
{}
catch留空,
------解决方案--------------------
不是很明白你的意思,你应该先update从表,再update 主表
------解决方案--------------------
既然因为约束关系更新了从表,何必再更新一次从表呢?
------解决方案--------------------
你一定要不触发异常的话就用这个吧:DataAdapter.ContinueUpdateOnError =true。

如果将 ContinueUpdateOnError 设置为 true,则在更新行过程中遇到错误时不引发异常。跳过该行的更新,并将错误信息置于出错行的 RowError 属性中。DataAdapter 继续更新后面的行。