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

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

  • 相关阅读:
    Java基础之在窗口中绘图——移动曲线的控制点(CurveApplet 3 moving the control points)
    【javascript】BOM介绍
    【javascript】Web Storage机制
    【javascript】50. Pow(x, n)
    【java】6. ZigZag Conversion
    【java】最长回文字符串(源码)
    【javascript】js实现单例模式
    【js注入】js注入
    【bootstrap】bootstrap可关闭警告框
    【h5】h5数据跨域交换postMessage用法
  • 原文地址:https://www.cnblogs.com/qzzy/p/2983340.html
Copyright © 2020-2023  润新知