2011-07-28 48 views
1

我已經通過添加類型列來定義DataTable。我期望DataTable的範圍在100萬到300萬行之間。如何在填充數據表時將DataTable內容複製到SQL表中

我使用Microsoft的TextFieldParser(因爲它支持多種固定寬度格式,以及通過Peek方法),以填充DataTable的行。

我想要進行某種操作,將數據表中的行復制到鏡像SQL表中。

如果我填充整個DataTable,然後使用SqlAdapter和SqlCommandBuilder更新SQL表here我提示內存不足。

我該如何做到這一點?

回答

1

建議不要將DataTable用於1M行,您可以簡單地爲INSERT創建新的SqlComand並使所有表字段成爲參數並在循環中運行此命令。

但如果你已經寫了很多與數據表中的代碼,你可能會認爲這是一個緩衝區,有以下解決方法:

1)儘可能將數據讀行,檢查有多少已已經閱讀到目前爲止

2)只要你得到10K行你執行DataTable.Update();

(你可以把這個參數作爲BUFFER_SIZE並把某處配置,以避免硬編碼)

3),那麼你清理DataTable中的所有數據,通過調用

DataTable.Clear(); 
DataTable.AcceptChanges(); 

4)你繼續從文件中讀取數據,循環重複


此外,如果不知道文件的結構和目的,很難提出一般性建議的應用程序中,我只回答瞭如何在使用非常大的數據集時避免「內存不足」的問題。但我也建議考慮所有可能的選擇,以避免使用.NET數據表作爲數據的中間存儲,並直接與所有可能意味着SQL服務器提供程序文件,如

1)BULK INSERT - http://msdn.microsoft.com/en-us/library/ms188365.aspx

2)BCP效用 - http://msdn.microsoft.com/en-us/library/ms162802.aspx

3)MS SQL Intergartion服務 - http://msdn.microsoft.com/en-us/library/ms141026.aspx

使用任何這些命令和工具的大容量插入操作可以從.NET發起。

+0

爲什麼不推薦?將它與SqlBulkCopy配對怎麼樣? –

+0

您可以真正將其與大容量拷貝配對,但是內存不足不是因爲使用SqlCommand,而是因爲內存中DataTable的大小非常大。僅批量複製可以優化INSERT操作的速度。在上面剛剛提出的解決方案中,使用SqlBulkCopy.WriteToServer –

相關問題