Dataset数据集ds1中保存从A数据表取的原有记录,ds2中保存从B表中取得的记录,A、B表具有相同的数据结构及相同主键,现需要将ds2中的记录与ds1合并,再update到A表中,通过事务进行处理,当update失败的时候回滚到A表原有状态,但现在出现问题,不能回滚,
如A表中原有记录:
ListNo(PK) Oper date
  3           li  6:33
B表中原有记录:
ListNo(PK) Oper date
  1           ma  9:11
  2           liu 3:08
  3           li  6:33
  4          chen 3:21
  5         zhang 8:33
update操作后,A表变成:
ListNo(PK) Oper date
  1           ma  9:11
  2           liu 3:08
  3           li  6:33
没有回滚到A表的原有状态,代码如下,麻烦高手告知一二,多谢
***********************************
            string cn = "Server=(local);Database=nx_Database;Integrated Security=SSPI";
            string cmd = "select * from Deal200909";
            SqlConnection sqlcn = new SqlConnection(cn);
            sqlcn.Open();
            
            SqlDataAdapter da = new SqlDataAdapter(cmd, cn);
            SqlCommandBuilder cb = new SqlCommandBuilder(da);            
                        
            try{
            SqlTransaction trans = sqlcn.BeginTransaction();
            da.UpdateCommand = new SqlCommand();
            da.UpdateCommand.Transaction = trans;
            //ds1中保存A表原有记录
            DataSet ds1 = new DataSet();
            da.FillSchema(ds1, SchemaType.Source);
            da.Fill(ds1, "200907");
            //ds2中保存B表中的记录,将A,B表合并
            ds1.Merge(ds2);
            Console.WriteLine("ds1 has merged");
            //执行Update操作
            da.Update(ds1, "200907");
            trans.Commit();
            Console.WriteLine("sucess!!");
            }
            catch (Exception e)
            {                Console.WriteLine(e);
                //回滚
                trans.Rollback();
                Console.WriteLine("fault!!");
            }            finally
            {
                sqlcn.Close();
            }

解决方案 »

  1.   

    感觉怪怪的 ,,你的事务是加在  da.UpdateCommand.Transaction = trans;  而你想在  ds1.Merge(ds2);  操作失败的时候回滚,这个事务应该是在操作SQL语句才执行的吧。
      

  2.   

    我是想在最后执行update的时候,如果update失败则A表回滚到原始状态,
    ds1.Merge(ds2)这里有问题吗?呵呵,我是新手
      

  3.   

    我也菜  呵呵 不过好像还是不对  A首先是空的 然后 通过代码 da.Fill(ds1, "200907");  A有了数据,你所指的update 是  da.Fill(ds1, "200907");  还是  ds1.Merge(ds2);  呢
     
    如果是第一个 回滚不回滚意义不大,如果是第二个 好像你的程序有问题 。
      

  4.   

    我指的是最后的da.Update(ds1, "200907"); 
      

  5.   

    在执行这句da.Update(ds1, "200907");之前 ds1里面的值 =  da  执行后里面还等于da啊
      

  6.   

    DataSet.Merge 方法 (DataTable)  public void Merge (
        DataTable table
    )
    参数
    table
    其数据和架构将被合并的 DataTable。 
      

  7.   

    如果lz想让B表的主键和A表的主键冲突来导致事物回滚,我觉得这样写不可行ds1你存储的是A表的数据
    ds2你存储的是B表的数据当你执行ds1.Merge(ds2)的时候,当遇到主键冲突的时候,ds1保留原来的数据,ds2的数据不增加进去SqlDataAdapter执行update的时候,它主要看的是DataTable行的RowState,因为原来ds1的数据行的状态的是Unchanged,新增行的数据状态时Added
    Unchanged 数据行不执行sql语句,added行状态的才执行,所以整个流程不存在数据冲突,就不回滚了纯属个人理解!!