2010-01-08 132 views
0

我正在尋找什麼是基於對象集合將大量記錄插入到數據庫(SQL2000以上)的最佳方式的建議。從哈希表中插入記錄到數據庫中

目前我的代碼看起來類似於下面的代碼片段,每個記錄都使用一個sql簡單的INSERT命令插入(每次調用函數時打開和關閉數據庫連接!) - 我確信這必須減慢速度?)。

該例程需要能夠處理日常插入多達100,000條記錄,我想知道是否有更快的方法(我確定必須有???)。我見過一些文章提到使用基於XML的數據和批量複製例程 - 這是我應該考慮的,還是任何人都可以提供任何我可以構建的簡單例子?

foreach (DictionaryEntry de in objectList) 
{ 
    eRecord record = (eRecord)de.Value; 

    if (!record.Deleted) 
    { 
    createDBRecord(record.Id,    
        record.Index, 
        record.Name, 
        record.Value); 
    } 
} 

感謝您的任何建議,

保羅。

回答

2

這樣做會比較慢。您需要考慮使用BCP或BULK INSERT的批量INSERT技術,或者如果您使用的是.NET 2.0,則可以使用SqlBulkCopy class。下面是一個使用SqlBulkCopy的示例:SqlBulkCopy - Copy Table Data Between SQL Servers at High Speeds

下面是SQL Server 2000的一個簡單的例子:

如果你有一個CSV文件,csvtest.txt,按以下格式:

1,約翰·史密斯

2,鮑勃,希望

3,凱特,居里

4,彼得,綠

該SQL腳本將CSV文件的內容加載到數據庫表(如果有任何行包含將不插入錯誤,但其他行會):

USE myDB 
GO 

CREATE TABLE CSVTest 
(
    ID INT, 
    FirstName VARCHAR(60), 
    LastName VARCHAR(60) 
) 
GO 

BULK INSERT 
CSVTest 
FROM 'c:\temp\csvtest.txt' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 


SELECT * 
FROM CSVTest 
GO 

你可以寫出來的詞典內容轉換成CSV文件,然後BULK INERT該文件。

參見:Using bcp and BULK INSERT

如果您實現自己的IDataReader方法,你能避免編寫一個imtermediate文件。見ADO.NET 2.0 Tutorial : SqlBulkCopy Revisited for Transferring Data at High Speeds

相關SO問題:how to pass variables like arrays/datatable to SQL server?

+0

感謝您的回答是的,我正在使用.NET 2.0,所以我會考慮你所提到的類,因爲我想直接使數據庫的操作如果可能的話。 你有任何SqlBulkCopy類的經驗嗎? 非常感謝, 保羅 – Paul 2010-01-08 11:03:52

+0

@保羅:當然可以。 SqlBulkCopy的執行速度非常快。我已經幫助團隊達到了3個數量級。 – 2010-01-08 11:54:24

+0

感謝米奇 - 我要開始閱讀和學習! 乾杯 – Paul 2010-01-08 12:39:07