zoukankan      html  css  js  c++  java
  • 测试SqlBulkCopy类批量插入数据

    今天读"SQLServer中批量插入数据方式的性能对比"时发现SqlBulkCopy可批量插入数据,而且代码比较简洁,由是我就测试了一下,下面是结果.

    • 如果表的字段长度小于实际字符的长度,记录入库时不是抛出截断异常,而抛出"在从服务器接收结果时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道已结束。)"异常,然后Sql Server停止,数据库无法访问。 这个异常也有点太大了吧!
    • 可定义记录入库批次,当出现异常时,该批次事物回滚,本功能无需定义
    • 如果当一条记录入库失败,其它记录都回滚需要定义参数SqlTransaction
        static void SqlBulkCopyTest(DataTable dt)
        {
            using (SqlConnection conn = new SqlConnection("Server=localhost;DataBase=B2B;Uid=sa;Pwd=ll;"))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction();
                using (SqlBulkCopy bulkCoye = new SqlBulkCopy(conn
                    , SqlBulkCopyOptions.Default
                    , tran))
                {
                    bulkCoye.DestinationTableName = "song";
                    //设定超时时间
                    bulkCoye.BulkCopyTimeout = 10;
                    //每批插入的行数(如果入库失败,只是本批次事物回滚,如果想全部回滚还需要加参数SqlTransaction)
                    bulkCoye.BatchSize = 2;
                    //在上面定义的批次里,每准备插入1条数据时,呼叫相应的事件(这时只是准备,没有真正入库)
                    bulkCoye.NotifyAfter = 1;
                    bulkCoye.SqlRowsCopied += new SqlRowsCopiedEventHandler(SqlRowsCopied);
                    try
                    {
                        bulkCoye.WriteToServer(dt);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }
            }
        }
    
        static void SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
        {
            Console.WriteLine("入库行数:" + e.RowsCopied);
        }
    
  • 相关阅读:
    怎样开始学日语
    转 送给日语初学者的寄语
    分享一个flash播放音乐的类
    日语网址
    北京奥运会门票价格一览表
    上班防沉迷系统
    ActionScript 3.0 概要
    Actionscript 3学习资源
    客户导入后需要Update的字段
    ORA01219
  • 原文地址:https://www.cnblogs.com/lilin/p/1718922.html
Copyright © 2011-2022 走看看