insert into [BillItemDetails] ([Name],[Sum],[Num],[Purpose],[BID]) values ('AAA',1000,10,'BBB',2)
我想建一个存储过程往表BillItemDetails中执行如上的N条语句,当其中一条语句失败时,回滚之前执行的insert语句。请问这样的存储过程该如何写?如果用存储过程无法实现的话,请问该用什么方法实现(最好能帖点C#代码),谢谢各位了~~
我想建一个存储过程往表BillItemDetails中执行如上的N条语句,当其中一条语句失败时,回滚之前执行的insert语句。请问这样的存储过程该如何写?如果用存储过程无法实现的话,请问该用什么方法实现(最好能帖点C#代码),谢谢各位了~~
begin transaction
insert into table value(.....)
.
.
.
insert into table....
commit transaction使用存储过程,在过程中也要使用事务来出来
当然也可以使用程序中的事务来实现,看下面的例子:
string flag="";
SqlConnection conn = new SqlConnection();
conn.ConnectionString = ConfigurationSettings.AppSettings["ConnStr"];
if (conn.State.ToString() == "Closed")
{
conn.Open();
}SqlTransaction myTrans;//
myTrans = conn.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");//SqlCommand comm = new SqlCommand();
comm.Connection = conn ;
comm.Transaction=myTrans;//try
{
comm.CommandText = "insert into testtransaction values('ta的value:0','tb的value:0',getdate(),33.33,'te的类型是ntext,值:0',10000,'tg的value:0')";
comm.ExecuteNonQuery (); comm.CommandText = "insert into testtransaction values('ta的value:100','tb的value:100',getdate(),33.33,'te的类型是ntext,值:100',10000,'tg的value:100')";
comm.ExecuteNonQuery (); myTrans.Commit();//
flag="1";
}
catch(Exception ep)
{
myTrans.Rollback("SampleTransaction");//
flag="0";
Page.Response.Write(ep.Message.ToString()+"<br>");
}if (conn.State.ToString() == "Open")
{
conn.Close();
}
conn.Dispose();if(flag.CompareTo("1")==0)
{
Page.Response.Write("事务成功");
}
else if(flag.CompareTo("0")==0)
{
Page.Response.Write("事务失败!");
}
所有的事务操作要么全部执行,要么全不执行.由数据库管理系统负责保证事务中所描述代码的自动执行.
一旦SqlServer服务开始启动,它将一直执行一个称为自动恢复的处理,它通过检查事务日志来确定完成的事务被写回磁盘,没完成的事务被撤消或回滚.没有任何办法关掉该自动恢复处理.
当你将多个修改语句链接到一个事务中时,你所需做的第一件事就是用Begin transaction 或Begin Tran命令启动一个事务,后面的语句一直到Commit命令都属于事务的内容部分.
你还可以给事务取名,如:
BEGIN TRAN UPDATE_TABLE
.
.
.
COMMIT TRAN UPDATE_TABLE