惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
H
Help Net Security
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
I
InfoQ
SecWiki News
SecWiki News
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
M
MIT News - Artificial intelligence
S
Schneier on Security
T
Threat Research - Cisco Blogs
F
Fortinet All Blogs
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The Cloudflare Blog
Recent Announcements
Recent Announcements
Security Latest
Security Latest
G
GRAHAM CLULEY
IT之家
IT之家
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
Google DeepMind News
Google DeepMind News
V
V2EX
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
S
SegmentFault 最新的问题
博客园 - 叶小钗
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure

博客园 - Laser.NET

WumiiRelatedItems C#创建一个线程为什么会消耗那么多的内存? 【跨平台的.NET解决方案】-Mono越来越成熟! [转]英语中符号以及标点符号的读法(或许对查看英文资料的人有些帮助) 06年中国互联网调查结果之:网民上网经常使用的网络服务 让短信更好的为企业服务!——短消息交互平台简介 GoF Patterns [ASP.NET2.0]一个方便使用的在线截图Web控件-WebImageMaker [转]经典的几个网络签名:) [新手点滴] IDbCommand.Prepare()方法。 [原创] 我的生活我安排,我的调度我做主!——介绍一个 日程安排/工作计划/任务调度 的Scheduling组件。(二) [原创] 我的生活我安排,我的调度我做主!——介绍一个 日程安排/工作计划/任务调度 的Scheduling组件。(一) [转] IE的bug列表 [C#语言] C#语言中又一个自认为不太理想的地方。。。 [辅助工具] 一个方便将ASP代码升级到ASP.NET的小工具 -- ASP Code Migrator! 关于ASP.NET页面嵌入代码的高亮显示的问题。 [C#语言] C#语法中一个很奇怪的地方:) 这样的网站,2个月是否可能?? [新手点滴] C# vs VB.NET 哪个好?
[ADO.NET]由数据库触发器引发的问题
Laser.NET · 2005-12-12 · via 博客园 - Laser.NET

前一段时间在数据库中用了触发器后发现了一个问题:如果触发器中修改了某个表中的数据的话,那么用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语句影响了当前表多少行数据的程序就要小心了,尤其要注意不能在那些表上再定义修改其他表中数据的触发器了。否则可能就要出现一些“莫名其妙”的问题了:)

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