C#中调用存储过程,执行出错会不会回滚? 我记得我以前做的程序,调用SQLServer中的存储过程,如果执行过程中出现错误就会回滚,最近又做了一个程序,执行出了错误又不回滚,我现在也不明白默认的存储过程到底会不会回滚?请高手给个答案. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我里面没有写那些BEGIN TRANSACTION COMMIT TRANSACTION等代码,会不会回滚? 必须写BEGIN TRANSACTION COMMIT TRANSACTION等代码才能回滚? 在代码中使用分布式事务TransactionScope,这个需要数据库支持,并打开相应的服务。 我的另外一个帖子:大家也看看吧,完了一起结掉http://community.csdn.net/Expert/topic/5188/5188497.xml?temp=.7404901一个存储过程要执行多条SQL语句,如果程序执行出错为了能够回滚是不是要如下写法?BEGIN TRANSACTION EXEC SQL语句1 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLEREXEC SQL语句2 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLEREXEC SQL语句3 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLER.....EXEC SQL语句N SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLERCOMMIT TRANSACTIONERROR_HANDLER: IF @@TRANCOUNT != 0 ROLLBACK TRANSACTION RETURN @Error有没有简单的写法不要写那么多的 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLER sql中是要这样写的,c#代码会简单些,但是c#代码并不一定会回滚,如果你的数据库连接断了,那么就谈不上执行失败和回滚了。 必须加BEGIN TRANSACTION COMMIT TRANSACTION才能回滚 存储过程中的sql命令属于事务处理范畴,即存储过程中的所有sql语句要么都执行,要么都不执行,即"原子性". 你可以写一个存储过程来试试:create database testuse testcreate datatable t1( tID int identity(1,1), tAction nvarchar(30))gocreate proc p1asinsert into t1 (tAction) values ('xxx')insert into t1 (tAction) values (bbb)因为 bbb 没有加引号 所以会出错 ,之前成功执行的 'xxx'也被回滚了 同意Dream6000不加BEGIN TRANSACTION COMMIT TRANSACTION也会回滚 之前说错了 存储过程是不会被回滚的create table t2( tID int identity(1,1), tAction nvarchar(30) not null)gocreate proc p2asinsert into t2 (tAction) values ('xxx')insert into t2 (tAction) values (null)exec p2虽然出错但 xxx 可以被写入 需要使用SqlTransaction类启动事务,或在存储过程中实现Sql 事务语句。http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx Dream6000我用SqlServer 2005测试了一下,确实是回滚了啊,两条记录都没写入。 To : sxmsy888(网际浪子) 在SQLServer 2000下,之前我也认为会回滚,测试后发现并不回滚! SqlServer 2005下没有测试过 c# 集合关系 自学云计算,从何下手?请教 字符串动态提取字符 c#中如何实现子程序块??? sqlConnection 的精浅问题? 谁有操作串口以pdu模式发送短信的程序代码? 水晶报表打印消费明细单,长度不固定,可以实现吗? WebService和.Net Remoting 的区别? IIS网站开发两个端口的问题 关于数字证书和数字签名。 create sequence ????????? C#简单算术运算程序遇到索引越界问题,急!
http://community.csdn.net/Expert/topic/5188/5188497.xml?temp=.7404901一个存储过程要执行多条SQL语句,如果程序执行出错为了能够回滚是不是要如下写法?
BEGIN TRANSACTION
EXEC SQL语句1
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLEREXEC SQL语句2
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLEREXEC SQL语句3
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLER.....
EXEC SQL语句N
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLER
COMMIT TRANSACTIONERROR_HANDLER:
IF @@TRANCOUNT != 0 ROLLBACK TRANSACTION
RETURN @Error有没有简单的写法不要写那么多的 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLER
你可以写一个存储过程来试试:
create database test
use test
create datatable t1
(
tID int identity(1,1),
tAction nvarchar(30)
)
gocreate proc p1
as
insert into t1 (tAction) values ('xxx')
insert into t1 (tAction) values (bbb)
因为 bbb 没有加引号 所以会出错 ,之前成功执行的 'xxx'也被回滚了
不加BEGIN TRANSACTION COMMIT TRANSACTION也会回滚
(
tID int identity(1,1),
tAction nvarchar(30) not null
)
gocreate proc p2
as
insert into t2 (tAction) values ('xxx')
insert into t2 (tAction) values (null)
exec p2
虽然出错但 xxx 可以被写入
http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
我用SqlServer 2005测试了一下,确实是回滚了啊,两条记录都没写入。
SqlServer 2005下没有测试过