if exists 和 SqlBulkCopy,SqlTransaction


最近写了一个关于数据移植的C/S应用,首先用到了事务,刚开始使用的的COM+写的事务,因为需要多个SqlCommand和多个SqlBulkCopy两种操作,刚开始想把这些写到一个事务里统一回滚,可是我在VS2005里写的程序,以前COM+事务是在VS2010里写的B/S项目中用到的,所以忙活了半天,COM+事务一直抱错,最后不知所以然,如果哪位高手明白可以告诉我,谢谢了。最后我使用了SqlTransaction但是只能让多个SqlCommand操作数据回滚。

View Code
 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语句的使用例子。

View Code
 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内部的事务回滚很是好用。

View Code
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的时候我想笑。当然并不是嘲笑,只是感到不可思议。

呵呵,终归所属,小生也是一个新手,有什么不对的地方请大家多多指教。

优质内容筛选与推荐>>
1、第五次作业
2、大数定律
3、如何解决ORA-12547: TNS:lost contact错
4、Python学习之109道面试题(上)
5、C# 字符串与二进制的相互转换


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn