.net批量插入数据到MSSQL

之前一直用DATATABLE批量更新到数据库,今天发现Adapter.Update数据超过60万条数据时导入会超时

    ' DT合并到数据库
     Public   Sub  UpdateData( ByVal  dt  As  DataTable)
        
Dim  conn  As   New  SqlConnection(_Conn.sStr)
        
Dim  myAdapter  As   New  SqlDataAdapter()
        
Dim  myCommand  As   New  SqlCommand( " select * from 承保信息 where id=0 " , conn)
        myAdapter.SelectCommand 
=  myCommand
        
Dim  myCommandBuilder  As   New  SqlCommandBuilder(myAdapter)
        myAdapter.Update(dt)
    
End Sub

找了一下资料,测试用下面的代码一次可以插入一百多万条数据,通过MSSQL事件探查器发现Adapter.Update是一条一条插入数据表,而SqlBulkCopy是5万5万插入。

    Sub  AddData( ByVal  dt  As  DataTable)
        
Dim   str   As   String   =  _Conn.sStr
        
' 声明数据库连接 
         Dim  conn  As   New  SqlConnection( str )
        conn.Open()
        
' 声明SqlBulkCopy ,using释放非托管资源 
         Using  sqlBC  As   New  SqlBulkCopy(conn)
            
' 定义一次批量的插入的数据量 
            sqlBC.BatchSize  =   50000
       
            
' 设置要批量写入的表 
            sqlBC.DestinationTableName  =   " 承保信息 "

            
' 自定义的datatable和数据库的字段进行对应 
            sqlBC.ColumnMappings.Add( " 车牌号 " " 车牌号 " )
            sqlBC.ColumnMappings.Add(
" 车架号 " " 车架号 " )
            sqlBC.ColumnMappings.Add(
" 发动机号 " " 发动机号 " )
            sqlBC.ColumnMappings.Add(
" 保单号 " " 保单号 " )
            sqlBC.ColumnMappings.Add(
" 签单日期 " " 签单日期 " )
            sqlBC.ColumnMappings.Add(
" 保险起期 " " 保险起期 " )
            sqlBC.ColumnMappings.Add(
" 保险止期 " " 保险止期 " )
            sqlBC.ColumnMappings.Add(
" GUID " " GUID " )

            
' 批量写入 
            sqlBC.WriteToServer(dt)
        
End   Using
        conn.Dispose()
    
End Sub

Adapter.Update生成的SQL语句

exec  sp_executesql N ' INSERT INTO [承保信息] ([车牌号], [车架号], [发动机号], [保单号], [签单日期], [保险起期], [保险止期], [GUID]) VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8) ' , N ' @p1 nvarchar(7),@p2 nvarchar(8),@p3 nvarchar(7),@p4 nvarchar(22),@p5 datetime,@p6 datetime,@p7 datetime,@p8 char(36) ' @p1   =  N ' 闽D17867 ' @p2   =  N ' 04353437 ' @p3   =  N ' 4106392 ' @p4   =  N ' PDAA200835020117022132 ' @p5   =   ' 12  8 2008 12:00:00:000AM ' @p6   =   ' 01  1 2009 12:00:00:000AM ' @p7   =   ' 12 31 2009 12:00:00:000AM ' @p8   =   ' 0d603eb4-4040-4d84-833d-1566c5dad4f0 '

SqlBulkCopy生成的SQL语句

insert   bulk  承保信息 ( [ 车牌号 ]   NVarChar ( 50 ) COLLATE Chinese_PRC_CI_AS,  [ 车架号 ]   NVarChar ( 50 ) COLLATE Chinese_PRC_CI_AS,  [ 发动机号 ]   NVarChar ( 50 ) COLLATE Chinese_PRC_CI_AS,  [ 保单号 ]   NVarChar ( 50 ) COLLATE Chinese_PRC_CI_AS,  [ 签单日期 ]   DateTime [ 保险起期 ]   DateTime [ 保险止期 ]   DateTime [ GUID ]   Char ( 100 ) COLLATE Chinese_PRC_CI_AS)

 

你可能感兴趣的:(MSSQL)