使用sqlBulk批量插入数据。这个只能插入,不能修改
插上1万行以上级别时,特别好用
适合于把本地表,大量插入到数据库的同一个表。不是同一个表,就看懂代码稍作修改
微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlbulk?view=netframework-4.0
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
为了防止掉坑,我推荐直接用SqlCommand对着目标表,查询一个空白的临时结构表出来,然后利用这个结构表addnew,然后插入数据库,最后扔掉这个临时表
这种做法,就能在BS开发里,进入异步进行大量插入。一般批量插入都是耗时的,都是开异步,开异步就不能利用主线程的表,得用我这个思路
在0.5-3万时没什么感觉,在10-100万行时,基本能得到1秒1w+行的速度
软件层会受 主键/索引/触发器/外键 等影响,硬件层会受 网络带宽 / 服务器I/O / 服务器硬盘读取/写入等影响,所以每个人效果都不同,自行测试