我在SQL数据库test中有两个表Test1和Test2,现在我想把表1的数据复制到表2中去,把表1的数据先删除,然后再插入表2的数据,用数据库事务实现,如果不成功就回滚。用程序代码该怎么实现阿??请各位高人指教!

解决方案 »

  1.   

    1. Sql写法(事物+游标)--开始事务
    BEGIN TRAN--不显示计数信息
    SET NOCOUNT ON
    DECLARE @ProjNo varchar(50),@CusNo varchar(50)--声明游标
    DECLARE CRMPSContact_cursor CURSOR FOR 
    SELECT ProjNo
    FROM CRMPSContact
    WHERE ProjNo>0--打开游标
    OPEN CRMPSContact_cursor--取第一行的值给专案变量: @ProjNo
    FETCH NEXT FROM CRMPSContact_cursor 
    INTO @ProjNo--取得客户号
    select @CusNo = CusNo 
    from CRMPSProjectM 
    where ProjNo = @ProjNo--得到CRMPSContact中某专案号对应的客户号
    update CRMPSContact 
    set CusNo = @CusNo
    where ProjNo = @ProjNo--执行错误回滚
    if @@error!=0
      begin
        rollback tran
        return
      end--移动游标,其它所有行更新操作(当到结尾时退出)
    WHILE @@FETCH_STATUS = 0
    BEGIN      
       --游标移到下一行
       FETCH NEXT FROM CRMPSContact_cursor 
       INTO @ProjNo   --取得客户号
       select @CusNo = CusNo 
       from CRMPSProjectM 
       where ProjNo = @ProjNo   --得到CRMPSContact中某专案号对应的客户号
       update CRMPSContact 
       set CusNo = @CusNo
       where ProjNo = @ProjNo
       
       --执行错误回滚
       if @@error!=0
       begin
         rollback tran
         return
       end
    END--提交所有变更
    COMMIT TRAN--关闭游标
    CLOSE CRMPSContact_cursor--释放游标
    DEALLOCATE CRMPSContact_cursor--恢复设置
    SET NOCOUNT OFF
    GO2. C#写法:
      public void UpdateContactTableByDataSet(DataSet ds,string strTblName)
    {
    try
    {
    SqlDataAdapter myAdapter = new SqlDataAdapter();
    SqlConnection  conn = new SqlConnection(strConnection);
    SqlCommand myCommand = new SqlCommand(SQL_GetAllRecordFromDemand(strTblName),conn);
    myAdapter.SelectCommand = myCommand;
    SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);

    conn.Open();
    SqlTransaction myTrans = conn.BeginTransaction();
    myCommand.Transaction = myTrans;

    try
    {
    myAdapter.Update(ds,strTblName);
    myTrans.Commit();
    }
    catch(Exception e)
    {
    try
    {
    myTrans.Rollback();
    }
    catch (SqlException ex)
    {
    if (myTrans.Connection != null)
    {
    Console.WriteLine("回滚失败! 异常类型: " + ex.GetType());
    }
    }
    }
    finally
    {
    conn.Close();
    }

    }
    catch(Exception ex)
    {
    throw ex;
    }
    }
      

  2.   

    1、在数据库procedure里面控制事务
    2、使用SqlTransaction class
      

  3.   

    我是这样写的,哪里有错误呢??? public void tempToTable()
    {
    string connStr="server=YNTDEV073;uid=sa;pwd=;database=Test";
    SqlConnection sqlConn=new SqlConnection(connStr);
    SqlTransaction sqlTrans1,sqlTrans2;
    string sqlCopy="insert into Test2 select * from Test1";
    SqlCommand sqlCmd=new SqlCommand();
    SqlCommand sqlCmdDelete=new SqlCommand("delete Test2",sqlConn);
    sqlCmd.CommandText=sqlCopy;
    sqlTrans1=sqlConn.BeginTransaction();
    sqlTrans2=sqlConn.BeginTransaction();
    sqlCmd.Connection=sqlConn;
    sqlCmd.Transaction=sqlTrans2;
    sqlCmdDelete.Transaction=sqlTrans1;
    sqlConn.Open();
    try
    {
    sqlCmdDelete.ExecuteNonQuery(); sqlTrans1.Commit();
    try
    {
    sqlCmd.ExecuteNonQuery();
    sqlTrans2.Commit();
    }
    catch
    {
    sqlTrans2.Rollback();
    }
    }
    catch
    {
    sqlTrans1.Rollback();
    }
    finally
    {
    sqlConn.Close();
    }
    }