使用SqlBulkCopy大批量导入数据

实际的开发可能会遇到数据大批量插入数据的问题,若是一条条的循环倒数效率非常低下,这个较好的解决方案
 1 
 2     protected   void  Button1_Click( object  sender, EventArgs e)
 3      { 
 4 
 5          DateTime beginTime  =  DateTime.Now;
 6          Response.Write( " 开始时间: "   +  beginTime.ToString( " yyyy年MM月dd日:HH:mm:ss:fff " )); 
 7 
 8           // 构造一个Datatable存储将要批量导入的数据
 9          DataTable dt  =   new  DataTable();
10          dt.Columns.Add( " id " typeof ( string ));
11          dt.Columns.Add( " name " typeof ( string )); 
12 
13           //  见识下SqlBulkCopy强悍之处,来个十万条数数据试验
14           int  i;
15           for  (i  =   0 ; i  <   100000 ; i ++ )
16          {
17              DataRow dr  =  dt.NewRow();
18              dr[ " name " =  i.ToString();
19              dt.Rows.Add(dr);
20          } 
21 
22           string  str  =  ConfigurationManager.ConnectionStrings[ " connStr " ].ConnectionString.ToString();
23           // 声明数据库连接
24          SqlConnection conn  =   new  SqlConnection(str); 
25 
26          conn.Open();
27           // 声明SqlBulkCopy ,using释放非托管资源
28           using  (SqlBulkCopy sqlBC  =   new  SqlBulkCopy(conn))
29          {
30               // 一次批量的插入的数据量
31              sqlBC.BatchSize  =   1000 ;
32               // 超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
33              sqlBC.BulkCopyTimeout  =   60
34 
35               // 設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。  
36              sqlBC.NotifyAfter  =   10000 ;
37              sqlBC.SqlRowsCopied  +=   new  SqlRowsCopiedEventHandler(OnSqlRowsCopied); 
38 
39               // 设置要批量写入的表
40              sqlBC.DestinationTableName  =   " dbo.text "
41 
42               // 自定义的datatable和数据库的字段进行对应
43              sqlBC.ColumnMappings.Add( " id " " tel " );
44              sqlBC.ColumnMappings.Add( " name " " neirong " ); 
45 
46               // 批量写入
47              sqlBC.WriteToServer(dt);
48          }
49          conn.Dispose();
50          Response.Write( " <br/> " ); 
51 
52   
53 
54          DateTime endTime  =  DateTime.Now;
55          Response.Write( " 结束时间: "   +  endTime.ToString( " yyyy年MM月dd日:HH:mm:ss:fff " ));
56          TimeSpan useTime  =  endTime - beginTime; // 使用时间
57          Response.Write( " <br/>插入时间: " +  useTime.TotalSeconds.ToString() + " " ); 
58 
59      }
60       // 响应时事件
61       void  OnSqlRowsCopied( object  sender, SqlRowsCopiedEventArgs e)
62      {
63          Response.Write( " <br/> OK!  " );
64      } 
65 
66   
67 
68 
这个是程序的运行结果:  
使用SqlBulkCopy大批量导入数据

你可能感兴趣的:(copy)