insert into [BillItemDetails] ([Name],[Sum],[Num],[Purpose],[BID]) values ('AAA',1000,10,'BBB',2)
我想建一个存储过程往表BillItemDetails中执行如上的N条语句,当其中一条语句失败时,回滚之前执行的insert语句。请问这样的存储过程该如何写?如果用存储过程无法实现的话,请问该用什么方法实现(最好能帖点C#代码),谢谢各位了~~

解决方案 »

  1.   

    使用“事务”实现,可以不用存储过程:
    begin transaction
    insert into table value(.....)
    .
    .
    .
    insert into table....
    commit transaction使用存储过程,在过程中也要使用事务来出来
      

  2.   

    上面的把组合的sql语句执行即可,
    当然也可以使用程序中的事务来实现,看下面的例子:
    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("事务失败!");
    }
      

  3.   

    用事务.
    所有的事务操作要么全部执行,要么全不执行.由数据库管理系统负责保证事务中所描述代码的自动执行.
    一旦SqlServer服务开始启动,它将一直执行一个称为自动恢复的处理,它通过检查事务日志来确定完成的事务被写回磁盘,没完成的事务被撤消或回滚.没有任何办法关掉该自动恢复处理.
    当你将多个修改语句链接到一个事务中时,你所需做的第一件事就是用Begin transaction 或Begin Tran命令启动一个事务,后面的语句一直到Commit命令都属于事务的内容部分.
    你还可以给事务取名,如:
    BEGIN TRAN UPDATE_TABLE
    .
    .
    .
    COMMIT TRAN UPDATE_TABLE