posts - 84,  comments - 880,  trackbacks - 7
公告

前一段时间在数据库中用了触发器后发现了一个问题:如果触发器中修改了某个表中的数据的话,那么用ExecuteNonQuery方法执行一个SQL语句的时候,返回的值将是触发器所影响的行数和sql语句本身所影响的行数的总和。这个问题,对于以往通过ExecuteNonQuery方法的返回值来得知当前SQL语句修改了当前表中几条记录的程序来说,就带来了些麻烦。

下面做个简单的例子,涉及倒两张表:main_table, another_table,和一个定义在main_table上的一个触发器eventful_trigger。

表main_table中有四条数据:

表another_table中有两条数据:

main_table上的触发器定义如下:

简单的测试程序代码如下:

运行结果如下:

本来上面例子中的update语句是修改main_table中的4条数据,但是ExecuteNonQuery方法却返回它修改了6条记录。它把触发器所影响的another_table中的2条数据也算进去了:4+2=6。
接下来再把触发器改为执行两个udpate语句:

程序返回的结果是影响了8行数据:

触发器中两个update语句分别影响了2行,再加上当前SQL语句本身影响了4行,所以是4+2*2=8。

通过进一步修改触发器,还可以让update语句象select语句那样返回数据
下面我们下面让maint_table的所有的insert/update/delete语句返回数据库系统的当前时间,在触发器中增加了返回时间的select语句:

为了显示出update语句返回的日期数据,将程序修改如下:

运行结果如下:


实际上有的时候程序希望精确的知道这个SQL语句对main_table中成功update了几行数据。但是实际上ADO.NET的ExecuteQuery方法却返回了包含触发器所影响的another_table表的行数在内的总的行数,甚至还能返回触发器中select出的数据集。这样程序有的时候就无法区分sql语句本身和触发器分别影响了多少数据,影响了那些表中的数据。

以往如果是依赖ExecuteNonQuery方法来判断当前Insert/update/delete语句影响了当前表多少行数据的程序就要小心了,尤其要注意不能在那些表上再定义修改其他表中数据的触发器了。否则可能就要出现一些“莫名其妙”的问题了:)

最后,在这里顺便向高手们请教:有没有比较好的解决这个问题的办法?望大家讨论和赐教

posted on 2005-12-12 22:36 Laser.NET 阅读(...) 评论(...) 编辑 收藏
无觅相关文章插件,快速提升流量