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();
}
如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();
}
ds1.Merge(ds2)这里有问题吗?呵呵,我是新手
如果是第一个 回滚不回滚意义不大,如果是第二个 好像你的程序有问题 。
DataTable table
)
参数
table
其数据和架构将被合并的 DataTable。
ds2你存储的是B表的数据当你执行ds1.Merge(ds2)的时候,当遇到主键冲突的时候,ds1保留原来的数据,ds2的数据不增加进去SqlDataAdapter执行update的时候,它主要看的是DataTable行的RowState,因为原来ds1的数据行的状态的是Unchanged,新增行的数据状态时Added
Unchanged 数据行不执行sql语句,added行状态的才执行,所以整个流程不存在数据冲突,就不回滚了纯属个人理解!!