2016-12-27 69 views
0

我想從大型80MB的大型Excel文件導入數據包含約。使用VB.NET將200萬行記錄到SQL服務器表中。如何導入大型數據從Excel文件在sql服務器

我用BulkCopy方法將數據複製到SQL服務器表中。但是在讀取大型Excel文件數據時,它給我提供了OutOFMemoryException問題的錯誤。從Excel中加載大量數據以解決此問題時,有沒有更好的方法?

另外我將列數據類型指定爲nvarchar(max)。有什麼解決辦法可以在動態創建表格時選擇適當的數據類型。

這裏是代碼段:

Public Function BulkInsertDataTable(ByVal connectionString As String, ByVal tableName As String, ByVal table As DataTable, ByVal con1 As SqlConnection, ByVal tran As SqlTransaction) As Boolean 
    ''IN USE - DO NOT REMOVE 

    Dim cmd1 As SqlCommand 
    Dim qry1 As String 

    If con1.State <> ConnectionState.Open Then 
     con1.Open() 
    End If 
    Dim tname As String = tableName 
    qry1 = "CREATE TABLE [" & tname & "] (" 

    Dim bulkCopy As New SqlBulkCopy(con1, SqlBulkCopyOptions.Default, tran) 

    bulkCopy.DestinationTableName = "[" & tableName & "]" 

    For j = 0 To table.Columns.Count - 1 
     If j <> table.Columns.Count - 1 Then 
      qry1 = qry1 & "[" & table.Columns(j).ColumnName & "] nvarchar(max)," 
     Else 
      qry1 = qry1 & "[" & table.Columns(j).ColumnName & "] nvarchar(max))" 
     End If 
     bulkCopy.ColumnMappings.Add(j, j) 
    Next 

    cmd1 = New SqlCommand(qry1, con1) 

    cmd1.Transaction = tran 
    cmd1.ExecuteNonQuery() 
    bulkCopy.WriteToServer(table) 
    bulkCopy.Close() 

    BulkInsertDataTable = True 
End Function 
+0

它會在哪一行發生內存不足異常? –

+0

@AndrewMorton,它從csv文件讀取數據時給我錯誤。 csvData = File.ReadAllText(targetPathwithName) – rahul16590

回答

0

對於ETL(提取傳輸&負載)程序,以較小的塊中被處理的數據被裝載可能需要它的量,而不是一次全部讀入。這樣可以減少程序的整體內存需求,但這確實需要額外的邏輯來處理從一個數據塊到下一個數據塊的轉換。該程序需要有一種方法來確定完成部分加載後還需要加載哪些數據。通過這樣做,程序應該避免遇到的內存不足異常。