好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

三种批量插入数据的方法

三种批量插入数据的方法

三种批量插入数据的方法

批量插入数据

      本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy, 使您可以用其他源的数据有效批量加载 SQL Server 表; 第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server 2008 中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据。

      代码示例:

      此例子为控制台输出程序,有两个类,一个为BulkData类,主要实现了表值参数和sqlbulkcopy是如何插入数据的,一个类为Repository,一个app.config配置文件。所用数据库为sql server 2012。

       建库语句:

    

打开

  1  -- Create DataBase
   2   use master
   3   go
   4   if  exists( select  *  from  master.sys.sysdatabases  where  name=N '  BulkDB  '  )
   5   drop database BulkDB
   6   create database BulkDB;
   7   go
   8  
  9  
 10  -- Create Table
  11   use BulkDB
  12   go
  13  
 14   if  exists( select  *  from  sys.objects  where  object_id=OBJECT_ID(N '  [dbo].[BulkTable]  ' ) and type  in (N '  U  '  ))
  15   drop table [dbo].BulkTable
  16   Create table BulkTable(
  17  Id  int   primary key,
  18  UserName nvarchar( 32  ),
  19  Pwd varchar( 16  ))
  20   go
  21  
 22  
 23  -- Create Table Valued
  24   use BulkDB
  25   go
  26  
 27   if   exists
  28   (
  29   select  *  from   sys.types st 
  30   join sys.schemas ss 
  31  on st.schema_id= ss.schema_id
  32   where  st.name=N '  [BulkType]  '  and ss.name=N '  dbo  ' 
 33   )
  34   drop type [dbo].[BulkType]
  35   go
  36  
 37  create type [dbo].[BulkType]  as   table
  38     (
  39     Id  int  ,
  40     UserName nvarchar( 32  ),
  41     Pwd varchar( 16  )
  42      )
  43   go
  44  
 45   select  *  from  dbo.BulkTable

       BulkData.cs

       

打开

 1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Text;
   5   using   System.Data;
   6   using   System.Data.SqlClient;
   7   using   System.Configuration;
   8  
  9   namespace   BulkData
  10   {
  11       class   BulkData
  12       {
  13           public   static   void   TableValuedToDB(DataTable dt)
  14           {
  15              SqlConnection sqlConn =  new   SqlConnection(
  16                ConfigurationManager.ConnectionStrings[ "  ConnStr  "  ].ConnectionString);
  17               const   string  TSqlStatement =
 18                "  insert into BulkTable (Id,UserName,Pwd)  "  +
 19                "   SELECT nc.Id, nc.UserName,nc.Pwd  "  +
 20                "   FROM @NewBulkTestTvp AS nc  "  ;
  21              SqlCommand cmd =  new   SqlCommand(TSqlStatement, sqlConn);
  22              SqlParameter catParam = cmd.Parameters.AddWithValue( "  @NewBulkTestTvp  "  , dt);
  23  
 24              catParam.SqlDbType =  SqlDbType.Structured;
  25             
 26              catParam.TypeName =  "  dbo.BulkType  "  ;
  27               try 
 28               {
  29                   sqlConn.Open();
  30                   if  (dt !=  null  && dt.Rows.Count !=  0  )
  31                   {
  32                       cmd.ExecuteNonQuery();
  33                   }
  34               }
  35               catch   (Exception ex)
  36               {
  37                   throw   ex;
  38               }
  39               finally 
 40               {
  41                   sqlConn.Close();
  42               }
  43           }
  44  
 45           public   static   DataTable GetTable()
  46           {
  47              DataTable dt =  new   DataTable();
  48  
 49              dt.Columns.AddRange( new  DataColumn[]{ new  DataColumn( "  Id  " , typeof ( int )), new  DataColumn( "  UserName  " , typeof ( string )), new  DataColumn( "  Pwd  " , typeof ( string  ))});
  50  
 51               return   dt;
  52           }
  53  
 54           public   static   void   BulkToDB(DataTable dt)
  55           {
  56              SqlConnection sqlConn =  new  SqlConnection(ConfigurationManager.ConnectionStrings[ "  ConnStr  "  ].ConnectionString);
  57              SqlBulkCopy bulkCopy =  new   SqlBulkCopy(sqlConn);
  58              bulkCopy.DestinationTableName =  "  BulkTable  "  ;
  59              bulkCopy.BatchSize =  dt.Rows.Count;
  60  
 61               try 
 62               {
  63                   sqlConn.Open();
  64                   if  (dt !=  null  && dt.Rows.Count !=  0  )
  65                       bulkCopy.WriteToServer(dt);
  66               }
  67               catch   (Exception ex)
  68               {
  69                   throw   ex;
  70               }
  71               finally 
 72               {
  73                   sqlConn.Close();
  74                   if  (bulkCopy !=  null  )
  75                       bulkCopy.Close();
  76               }
  77           }
  78       }
  79  }

      

       Repository.cs

打开

  1   using   System;
    2   using   System.Collections.Generic;
    3   using   System.Linq;
    4   using   System.Text;
    5   using   System.Data;
    6   using   System.Data.SqlClient;
    7   using   System.Configuration;
    8   using   System.Diagnostics;
    9  
  10   namespace   BulkData
   11   {
   12       public   class   Repository
   13       {
   14           public   static   void   UseSqlBulkCopyClass()
   15           {
   16              Stopwatch sw =  new   Stopwatch();
   17               for  ( int  outLayer =  0 ; outLayer <  10 ; outLayer++ )
   18               {
   19                  DataTable dt =  BulkData.GetTable();
   20                   for  ( int  count = outLayer *  100000 ; count < (outLayer +  1 ) *  100000 ; count++ )
   21                   {
   22                      DataRow r =  dt.NewRow();
   23                      r[ 0 ] =  count;
   24                      r[ 1 ] =  string .Format( "  User-{0}  " , count *  outLayer);
   25                      r[ 2 ] =  string .Format( "  Password-{0}  " , count *  outLayer);
   26                       dt.Rows.Add(r);
   27                   }
   28                   sw.Start();
   29                   BulkData.BulkToDB(dt);
   30                   sw.Stop();
   31                  Console.WriteLine( string .Format( "  {1} hundred thousand data elapsed Time is {0} Milliseconds  " , sw.ElapsedMilliseconds, outLayer +  1  ));
   32               }
   33  
  34               Console.ReadLine();
   35           }
   36  
  37           public   static   void   UseTableValue()
   38           {
   39              Stopwatch sw =  new   Stopwatch();
   40  
  41               for  ( int  outLayer =  0 ; outLayer <  10 ; outLayer++ )
   42               {
   43                  DataTable dt =  BulkData.GetTable();
   44  
  45                   for  ( int  count = outLayer *  100000 ; count < (outLayer +  1 ) *  100000 ; count++ )
   46                   {
   47                      DataRow dataRow =  dt.NewRow();
   48                      dataRow[ 0 ] =  count;
   49                      dataRow[ 1 ] =  string .Format( "  User-{0}  " , count *  outLayer);
   50                      dataRow[ 2 ] =  string .Format( "  Password-{0}  " , count *  outLayer);
   51                       dt.Rows.Add(dataRow);
   52                   }
   53  
  54                   sw.Start();
   55                   BulkData.TableValuedToDB(dt);
   56                   sw.Stop();
   57  
  58                  Console.WriteLine( string .Format( "  {1} hundred thousand data elapsed Time is {0} Milliseconds  " , sw.ElapsedMilliseconds, outLayer +  1  ));
   59               }
   60  
  61               Console.ReadLine();
   62           }
   63  
  64           public   static   void   UserNormalInsert()
   65           {
   66              Stopwatch sw =  new   Stopwatch();
   67  
  68              SqlConnection sqlConn =  new  SqlConnection(ConfigurationManager.ConnectionStrings[ "  ConnStr  "  ].ConnectionString);
   69  
  70              SqlCommand sqlComm =  new   SqlCommand();
   71              sqlComm.CommandText =  string .Format( "  insert into BulkTable(Id,UserName,Pwd)values(@p0,@p1,@p2)  "  );
   72              sqlComm.Parameters.Add( "  @p0  "  , SqlDbType.Int);
   73              sqlComm.Parameters.Add( "  @p1  "  , SqlDbType.NVarChar);
   74              sqlComm.Parameters.Add( "  @p2  "  , SqlDbType.VarChar);
   75              sqlComm.CommandType =  CommandType.Text;
   76              sqlComm.Connection =  sqlConn;
   77               sqlConn.Open();
   78  
  79               try 
  80               {
   81                   for  ( int  outLayer =  0 ; outLayer <  10 ; outLayer++ )
   82                   {
   83                       for  ( int  count = outLayer *  100000 ; count < (outLayer +  1 ) *  100000 ; count++ )
   84                       {
   85  
  86                          sqlComm.Parameters[ "  @p0  " ].Value =  count;
   87                          sqlComm.Parameters[ "  @p1  " ].Value =  string .Format( "  User-{0}  " , count *  outLayer);
   88                          sqlComm.Parameters[ "  @p2  " ].Value =  string .Format( "  Password-{0}  " , count *  outLayer);
   89                           sw.Start();
   90                           sqlComm.ExecuteNonQuery();
   91                           sw.Stop();
   92                       }
   93  
  94                      Console.WriteLine( string .Format( "  {1} hundred thousand data elapsed Time is {0} Milliseconds  " , sw.ElapsedMilliseconds, outLayer +  1  ));
   95                   }
   96               }
   97               catch   (Exception ex)
   98               {
   99                   throw   ex;
  100               }
  101               finally 
 102               {
  103                   sqlConn.Close();
  104               }
  105  
 106               Console.ReadLine();
  107           }
  108       }
  109  }

      

       App.config

打开

 1  <?xml version= "  1.0  "  encoding= "  utf-8  "  ?>
 2  <configuration>
 3    <connectionStrings>
 4      <add name= "  ConnStr  " 
 5        connectionString= "  data source=.;Integrated Security=SSPI;Initial Catalog=BulkDB  " 
 6        providerName= "  System.Data.SqlClient  "  />
 7    </connectionStrings>
 8  </configuration>

      

       Program.cs

打开

  1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Text;
   5   using   System.Data;
   6   using   System.Data.SqlClient;
   7   using   System.Configuration;
   8   using   System.Diagnostics;
   9  
 10   namespace   BulkData
  11   {
  12       class   Program
  13       {            
  14           static   void  Main( string  [] args)
  15           {
  16               //  Repository.UseSqlBulkCopyClass(); 
 17               Repository.UseTableValue();
  18               //  Repository.UserNormalInsert(); 
 19           }        
  20       }
  21  }

      

       三种方法分别插入100万条数据所用的时间为:

        循环语句所用时间:

       

         sqlbulkcopy方法所用时间为:

        

          表值参数所用时间为:

         

 

 

分类:  C#学习

标签:  C#学习

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于三种批量插入数据的方法的详细内容...

  阅读:44次