由于迎新系统的原始数据是高校招生系统中的数据,里面的数据库是vfp格式的,我做的迎新系统使用sqlserver2000的,再加上招生系统中的数据大部分数据字段是没有用的,所以只能从招生系统中的数据库筛选出一部分的数据字段插入到sqlserver2000中,但有一个问题,学校招生数据最少也有几千条数据,要从vfp中读取 一次性插入到sql2000中去,这样执行那么多条插入时肯定要用到事务使得但插入出错时前面的插入无效,查了许多资料,终于找到解决的方法。
TransactionScope 事务
在通过 new 语句实例化 TransactionScope 时,事务管理器将确定要参与哪个事务。一经确定,此范围将始终参与该事务。
如果在事务范围中(即从初始化 TransactionScope 对象到调用其 Dispose方法之间)未发生异常,则允许该范围所参与的事务继续。如果事务范围中的确发生了异常,它所参与的事务将回滚。
当应用程序完成它要在一个事务中执行的所有工作以后,您应当只调用Complete方法一次,以通知事务管理器可以接受提交事务。未能调用此方法将中止该事务。
对 Dispose 方法的调用标志着该事务范围的结束。在调用此方法之后发生的异常不会影响该事务。
如果在范围中修改 Current 的值,则会在调用 Dispose 时引发异常。但是,在该范围结束时,先前的值将被还原。此外,如果在创建事务的事务范围内对 Current 调用 Dispose,则该事务将在相应范围末尾处中止。
即不需要為每個connection指定一个transaction。
实例
using (TransactionScope ts = new TransactionScope()) { string connstr = @"Data Source=./SQLEXPRESS;AttachDbFilename=D:/ta.mdf;Integrated Security=True;User Instance=True"; using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); try { SqlCommand cmd = new SqlCommand("delete table1, conn); cmd.ExecuteNonQuery(); using (SqlConnection conn1 = new SqlConnection(connstr)) { conn1.Open(); SqlCommand cmd1 = new SqlCommand("insert into tableTXL(Name,Sex) values('ARC3','FeMale')", conn1); cmd1.ExecuteNonQuery(); SqlCommand cmd2 = new SqlCommand("insert into tableTXL(Name,Sex) values('ARC4','FeMale')", conn1); cmd2.ExecuteNonQuery(); ts.Complete(); MessageBox.Show("Transaction completed!"); conn1.Close(); } } catch (SqlException ex) { MessageBox.Show("Transaction RollBack!"+ex.Message); } conn.Close(); }