将大量数据从WCF调用插入SQL的最佳方法

时间:2011-10-13 10:12:45

标签: .net wcf sql-server-2008

我正在调用第三方Web服务,它返回大量XML(1000行)。将XML放入基础SQL Server 2008 R2表的最佳方法是什么。目前,我正在使用关联的XSD检索XML并反序列化为.NET类集合。然后我遍历集合,多次调用INSERT存储过程。性能不是太差,但我确信必须有更快的方法来做到这一点。我应该看看SqlBulkCopy吗?我听说LINQ-TO-SQL在批量插入/更新方面很慢。任何的建议都受欢迎。

1 个答案:

答案 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