我正在调用第三方Web服务,它返回大量XML(1000行)。将XML放入基础SQL Server 2008 R2表的最佳方法是什么。目前,我正在使用关联的XSD检索XML并反序列化为.NET类集合。然后我遍历集合,多次调用INSERT存储过程。性能不是太差,但我确信必须有更快的方法来做到这一点。我应该看看SqlBulkCopy吗?我听说LINQ-TO-SQL在批量插入/更新方面很慢。任何的建议都受欢迎。
答案 0 :(得分:2)
阅读SQLXMLBulkLoad4,它似乎处理XML到sql server的批量插入。我没有尝试过myselfe,但值得一试。
如果不起作用,请查看System.Data.SqlClient.SqlBulkCopy 使用SqlBulkCopy我在大约4秒钟内从文件中读取了200.000行数据。
以下代码将文件名作为参数,读取所有行并将行转换为添加到数据表的数据行(数据表必须具有与目标表相同的格式,在这种情况下我使用强类型数据表)。当数据表包含1000行时,我使用WriteToServer方法将其写入服务器。然后清空数据表并重新开始。
您可以轻松更改它以转换xml文档中的行。
Imports System.IO
Imports System.Data.SqlClient
Public Sub ParseFile(ByVal filename As String)
Using BulkCopy As SqlBulkCopy = New SqlBulkCopy(My.Settings.DBConnectionString, SqlBulkCopyOptions.TableLock)
BulkCopy.DestinationTableName = "Destinationtable"
Dim TableDataSet As New MyDS.UserDataTable
Try
Using sr As StreamReader = System.IO.File.OpenText(filename)
Dim l As String = Nothing
l = sr.ReadLine()
If Not l Is Nothing Then AddToDS(l, TableDataSet)
Do Until l Is Nothing
l = sr.ReadLine()
If Not l Is Nothing Then AddToDS(l, TableDataSet)
If TableDataSet.Rows.Count > My.Settings.BulkSize Then 'bulk copy every 1000 rows to db.
BulkCopy.WriteToServer(TableDataSet)
TableDataSet.Rows.Clear()
End If
Loop
If TableDataSet.Rows.Count > 0 Then 'write the rest
BulkCopy.WriteToServer(TableDataSet)
TableDataSet.Rows.Clear()
End If
sr.Close()
End Using
Catch ex As Exception
MsgBox("Error:" & ex.Message)
End Try
End Using
End Sub
Sub AddToDS(ByVal s As String, ByRef ds As MyDS.UserDataTable)
'row should contain username + tab + carname
Dim arr() As String = s.Split(vbTab)
If arr.Count < 2 Then Exit Sub
ds.AddUserRow(arr(0).Trim, arr(1).Trim)
End Sub