Foxtable用sqlBulkCopy批量插入大量数据到Sql数据库 (批量导入、快速导入、1秒1w行、快速Excel导入)

发表日期: 2021-06-03
文章位置: 首页 / 经验分享 / SQL经验分享

1.使用说明

使用sqlBulk批量插入数据。这个只能插入,不能修改

  1. 插上1万行以上级别时,特别好用

  2. 适合于把本地表,大量插入到数据库的同一个表。不是同一个表,就看懂代码稍作修改

微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlbulk?view=netframework-4.0

2.教程代码

Dim dt As DataTable = DataTables("ItemInfo") '修改为你的表
Dim conStr As String = "server=xxx,1433;uid=xxx;pwd=xxx;database=MH1WebDB" '改为自己数据库的连接字符串,注意跟狐表的数据库字符串不同,不能直接用
Dim tran As System.Data.SqlClient.SqlTransaction
Dim conn As new System.Data.SqlClient.SqlConnection(conStr)
Try
    Dim st As Date = Date.Now '计算耗时
    conn.Open() '打开链接
    tran = conn.BeginTransaction()'开始事务
    Dim mpList As new List(of System.Data.SqlClient.SqlBulkColumnMapping)
    '配置本地来源列与服务器目标列的配对关系,第一个参数是"来源列",第二个是"目标列"
    For Each dc As DataCol In dt.DataCols
        mpList.Add( new System.Data.SqlClient.SqlBulkColumnMapping(dc.Name, dc.Name))
    Next
    Dim  As new System.Data.SqlClient.SqlBulk(conn, System.Data.SqlClient.SqlBulkOptions.Default, tran)
    '把刚才的匹配关系,导进去SqlBulk的参数里
    For Each mp As System.Data.SqlClient.SqlBulkColumnMapping In mpList
        .ColumnMappings.Add(mp)
    Next
    .DestinationTableName = dt.Name '指定服务器上目标表的名称
    .BulkTimeout=30 '默认30秒超时
    .BatchSize = CInt(IIF(dt.DataRows.Count>10000,dt.DataRows.Count/10,0))  '每批事务插入的数据量,推荐插入的总行数/10,性能最佳
    .WriteToServer(dt.basetable)  '你的本地DataTable名字,要转成.net官方的基表类型
    tran.Commit()
    Dim res As Double = Format(dt.DataRows.Count /10000,"0.00")
    MessageBox.Show("批量插入成功, " & res & "W行 耗时: " & (Date.Now - st).TotalSeconds & "秒")    
Catch ex As exception
    tran.Rollback()    '返回False 执行失败!
    MessageBox.Show("批量插入失败,原因:" & ex.message)
Finally
    conn.Close() '关闭连接
End Try

3.注意事项

3.1原始表和目标表,要求表结构完全一样。

       为了防止掉坑,我推荐直接用SqlCommand对着目标表,查询一个空白的临时结构表出来,然后利用这个结构表addnew,然后插入数据库,最后扔掉这个临时表

这种做法,就能在BS开发里,进入异步进行大量插入。一般批量插入都是耗时的,都是开异步,开异步就不能利用主线程的表,得用我这个思路

3.2数据量越多越体现优势

在0.5-3万时没什么感觉,在10-100万行时,基本能得到1秒1w+行的速度

3.3导入速度,受多种软硬件因素影响,不绝对。

软件层会受 主键/索引/触发器/外键 等影响,硬件层会受 网络带宽 / 服务器I/O / 服务器硬盘读取/写入等影响,所以每个人效果都不同,自行测试

file   file    file


随便看看

Copyright © 2016-2022 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备17073215号