none
如何在代码中实现SQL触发器的功能 RRS feed

  • 问题

  • 请教各位前辈

    我之前使用SQL SERVER的触发器来实现的功能,现在想改成使用C#代码在业务逻辑层来实现.数据载体是DATASET.请问要怎么样实现触发器的功能呢.谢谢!

    之前已经有前辈Stone Z有说到使用使用DataSet的一些更新事件,但是目前发现因为DataSet是离线的数据载体,所以使用DataSet的更新事件来实现触发器功能可能会影响到数据的完整性.因为触发器要与DataSet的UPDATE在同一事务中处理.如果不在同一事务中,可能会造成数据的不完整.

    在保存DATASET修改时会先触发RowChanged,然后才做UPDATE,但是如果UPDATE不成功的话.RowChanged里执行的触发就无法回滚.

    请各位前辈指点一下.谢谢!


    -----------------------------------------------------
    深圳IT人社区
    深圳.NET俱乐部论坛
    www.szitr.com
    2009年3月12日 2:16

答案

  • 所有需要回滚的数据库操作都放在TransactionScope里面。约束、默认值这些是在数据更改之前进行数据操作,而触发器则是在数据更改之后进行数据操作。你可以把这些操作在应用程序里面重写。
    MSMVP VC++
    • 已标记为答案 Tony_Wu 2009年3月12日 15:08
    2009年3月12日 15:06
    版主

全部回复

  • 所有到数据访问层的调用都通过业务逻辑层做的话,你自己是知道自己在什么时候访问数据库的。在数据库操作之前/之后调用和trigger同等效果的代码就可以了。
    MSMVP VC++
    2009年3月12日 3:36
    版主
  • 谢谢您的回复
    但是我的事务是在数据访问层使用的.
    这样的话我需要将事务移到业务逻辑层来吗.
    如果不移到业务逻辑层,那要如何实现触发与UPDATE DATASET同时提交或回滚呢.
    2009年3月12日 7:52
  • 是啊,事务不是业务逻辑么?

    MSMVP VC++
    2009年3月12日 13:45
    版主
  • 请问前辈是怎么处理事务及触发器的?

    2009年3月12日 13:49
  • 一开始就没设计触发器这个东西,主要是数据库里面的东西做版本管理比较麻烦。

    MSMVP VC++
    2009年3月12日 14:23
    版主
  • 不知道是不是我没表达清楚

    银行 系统的
    存款记录
    时间                 帐户                  金额
    2009/1/10      111                 10000

    当以上记录INSERT/UPDATE/DELETE后就需要更新下面的帐户信息

    帐户信息
    帐户          余额
    111         10000

    如果用SQL的触发器的话就很简单...

    但现在想使用代码来实现触发器(而且要有Transcation).

    如果是您来做..您会怎么实现呢(分层的).想听听你的做法.可能我的想法从开始就是错误的.

    再次感谢.


    2009年3月12日 14:38
  • 所有需要回滚的数据库操作都放在TransactionScope里面。约束、默认值这些是在数据更改之前进行数据操作,而触发器则是在数据更改之后进行数据操作。你可以把这些操作在应用程序里面重写。
    MSMVP VC++
    • 已标记为答案 Tony_Wu 2009年3月12日 15:08
    2009年3月12日 15:06
    版主
  •  感谢您这么耐心的帮助.感谢!
    2009年3月12日 15:09