zoukankan      html  css  js  c++  java
  • .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)
  • 相关阅读:
    Spring框架构造注入的属性问题type属性
    Spring框架AOP添加日志记录功能
    Spring框架构造注入
    Spring框架AOP原理
    Spring框架构造注入的顺序问题index属性
    Spring框架使用P命名空间进行注入
    工作中的SQL脚本
    spring框架ioc设置注入小demo
    [笔试] C和C++动态内存分配和释放的区别
    [算法] 当今世界最为经典的十大算法投票进行时
  • 原文地址:https://www.cnblogs.com/LCX/p/1543154.html
Copyright © 2011-2022 走看看