最近写了一个关于数据移植的C/S应用,首先用到了事务,刚开始使用的的COM+写的事务,因为需要多个SqlCommand和多个SqlBulkCopy两种操作,刚开始想把这些写到一个事务里统一回滚,可是我在VS2005里写的程序,以前COM+事务是在VS2010里写的B/S项目中用到的,所以忙活了半天,COM+事务一直抱错,最后不知所以然,如果哪位高手明白可以告诉我,谢谢了。最后我使用了SqlTransaction但是只能让多个SqlCommand操作数据回滚。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 SqlTransaction tran ; 2 conn.Open(); 3 tran = conn.BeginTransaction("SampleTransaction"); 4 SqlCommand com = new SqlCommand(); 5 try 6 { 7 com.Transaction = tran; 8 com.Connection = conn; 9 com.CommandText = creatSql1; 10 com.ExecuteNonQuery(); 11 com.CommandText = creatSql2; 12 com.ExecuteNonQuery(); 13 com.CommandText = creatSql3; 14 com.ExecuteNonQuery(); 15 com.CommandText = creatSql4; 16 com.ExecuteNonQuery(); 17 com.CommandText = creatSql5; 18 com.ExecuteNonQuery(); 19 com.CommandText = creatSql6; 20 com.ExecuteNonQuery(); 21 com.CommandText = testSql; 22 com.ExecuteNonQuery(); 23 for (int i = 0; i < StudentDt.Rows.Count; i++) 24 { 25 string stuid = StudentDt.Rows[i][0].ToString(); 26 com.CommandText = "if exists (select * from Student where StuID ='" + stuid + "') return else insert into Student(StuID,StuName,StuGrade,StuClass,StuMemo)values(" + StudentDt.Rows[i][0] + ",'" + StudentDt.Rows[i][1].ToString() + "','" + StudentDt.Rows[i][2] + "'," + StudentDt.Rows[i][3] + ",'" + StudentDt.Rows[i][4] + "')"; 27 com.ExecuteNonQuery(); 28 29 } 30 tran.Commit();
这个段代码里包括了我对SqlTransaction的使用,和一个if exists语句的使用例子。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
string testSql = "if exists (select * from SysTest where IDStr ='" + testRow[0] + "'and Date=" + testRow[1].ToString().Substring(0, 10) + ") return else insert into SysTest(IDStr,Date,Title,IsAB,StuIDNum,PartNum,QusNum,TotalScore,PaperID,MemoStr,State)values('" + testRow[0] + "'," + testRow[1].ToString().Substring(0, 10) + ",'" + testRow[2] + "','" + testRow[3] + "'," + testRow[4] + "," + testRow[5] + "," + testRow[6] + "," + testRow[7] + "," + testRow[8] + ",'" + testRow[9] + "','" + testRow[10] + "')"; com.CommandText = "if exists (select name from sysobjects where xtype='u'and name ='" + tableName + "') " + "drop table " + tableName;
这个我在这个类里的另外两个关于if exists 的使用,我觉得在可以的情况下if exists可以代替许多程序的复杂操作。
至于SqlBulkCopy,小生惭愧也是第一次使用。但是SqlBulkCopy内部的事务回滚很是好用。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 SqlBulkCopy sbc = new SqlBulkCopy(DataConStr, SqlBulkCopyOptions.UseInternalTransaction); 2 sbc.BulkCopyTimeout = 5000; 3 sbc.NotifyAfter = accsseDT[0].Rows.Count; 4 sbc.DestinationTableName = _TaskName + "_" + _TaskTime + "_Part"; 5 sbc.WriteToServer(accsseDT[0]);
BulkCopyTimeout属性表示SqlBulkCopy操作所允许的秒数
NotifyAfter属性表示SqlBulkCopy操作所影响的行数
DestinationTableName属性表示SqlBulkCopy操作所对应的数据表的名字
WriteToServer方法是将数据复制到所对应的数据表中,他的参数是一个DataRow[],大家看到了我传入的是一个DataTable。这让我想起来一个事情,我有个同事工作一年了,不知道DataSet是一个DataTable集合,DataTable是一个DataRow集合,当他问我怎么把一个数据库返回的DataSet转换成一个DataTable的时候我想笑。当然并不是嘲笑,只是感到不可思议。
呵呵,终归所属,小生也是一个新手,有什么不对的地方请大家多多指教。