在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
解决这个问题的方法有很多种,可以锁定表记录、可以使用事务、使用select ... for update等,但都不是很简洁。今天在网上搜到一篇文章,是利用触发器来实现的,又学到了一手:http://hi.baidu.com/2hill/blog/item/dbc9dd135e5b4dd2f7039ec0.html 他的方法是在Insert或Update触发器中用select来返回需要的字段值。默认情况下,当insert时,触发其insert触发器,它的默认返回值是影响到的行数,语句是:select @@rowcount。如果利用insert和update触发器中的一个技巧,那就是“当insert时,数据库会生成一个临时表,就是inserted表;这个表会记录刚刚要插入的信息,insert完,它就消失了,我们只需select art_id from inserted就会返回刚刚插入的这条记录的art_id了”。同理,“在update时,会生成deleted与inserted两个临时表,一个是修改前数据,一个是修改后数据;我们只需在update触发器写一条select * from inserted就可以了(返回修改后的记录)”。那么就可以轻松的用一条insert或update语句来实现自增一个字段并取回自增前/后的值。 需要注意的是文章中指出在触发器中可以返回一个记录集,但是不支持大量的输出文本,这一点比较含糊,何为大量?文本又是指何种字段? 最后,结合上面所说,给出自己的代码: 先是C#代码,其中的db.GetDs()函数是返回sql执行后的数据集(DataSet对象),其函数的代码见我之前的文章,而此处其实是把update语句作为一个select对待,可以获取其结果集。同时,还可以获得update执行所影响到的行数,这个就需要通过SqlCommand对象的ExecuteNonQuery()函数了,此处不再介绍。
1sql = "update tbProcesses set Process_lastno=Process_lastno+1 where Process_id=" + long.Parse(processid);
然后是tbProcesses表的Update触发器:2long sn = long.Parse(db.GetDs(sql).Tables[0].Rows[0]["Process_lastno"].ToString());
1CREATE TRIGGER tr_U_returnLastNO ON [dbo].[tbProcesses]
说起来似乎有些复杂,但是实现还是蛮简单的,尤其是一步到位,不需要用到锁和事务。2FOR UPDATE 3AS 4select Process_lastno from inserted 5 最后,该提出的是我使用SQL Server 2000的数据库,但不知道Oracle数据库是否也能这样支持,需要进一步考证。 |
请发表评论