之前一直用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)