2011-10-14 44 views
4

我要做幾個插入到一個表中。現在,我列出了迭代的對象列表,對於每個對象,我使用insert語句執行ExecuteNonQuery。幾個插入性能c#

我想知道是否有緊固的方式來做到這一點。 這樣,插入800個寄存器需要幾分鐘的時間。

我在Java中使用了executeBatch方法,對於這個建議,誰在C#中有類似的東西。

問候!

回答

5

插入是[比較]快速/便宜行。 提交慢/昂貴。

除非它是一個延遲連接,多個(如在,數百)插入語句應該很好。

「...需要幾分鐘......」聽起來像交易沒有被使用(因此可能有800次提交 - 哎唷!)。一個控制在C#中交易最簡單的方法是使用TransactionScope

using (var connection = ...) 
using (var tx = new TransactionScope()) { 
    foreach (var row in rows) { 
     // insert row 
    } 
    // commit all at once 
    tx.Complete(); 
} 

我只會考慮方法是否限制交易的數量(從而提交)不足以滿足功能要求。

快樂編碼。

+0

我已經使用事務作用域(在業務層),所以我認爲只有一個提交時tx.Complete() – Keetah

+1

@Rodrigo只是驗證它真的被使用 - 在幾分鐘內800提交*真的很慢*。我無法想象,即使是過度索引和/或不好的碎片化也會導致這種情況(但我更爲驚訝;-)。還要驗證服務器的延遲是否可以接受; [高]延遲將成爲限制單個命令速度的問題。 (延遲50ms將最大單獨命令/秒減少到約20;因此可能是發送較少單個命令的非常好的候選者。如果相關,將這些信息包括在帖子中。) – 2011-10-14 01:11:32

+0

我正在嘗試通過VPN進程通過互聯網,所以也許是問題。我如何檢查延遲 – Keetah

1

你的語句可能是這樣的:

insert into my_table (field1, field2, ...) 
values (row1_value1, row2_value2, ...), 
     (row2_value1, row2_value2, ...), ... 

因此,如果您創建例如一個StringBuilder,您可以批了20個,50個或100插入,併發出要少得多插入語句。

+0

是的,這是一種方式,我只是覺得我可能是一個更好的方法來做到這一點。只是一個問題,你添加連接字符串的值?或使用動態名稱向命令添加參數? – Keetah

+0

我嘗試添加參數到命令,但我有一個例外,因爲我超過了參數限制(2100?)。我能怎麼做 ? – Keetah

+0

@Rodrigo:你插入了多少列?換句話說,如果你將2100除以列數,你還能批量處理大量的行嗎?如果是的話,堅持這個限制。如果不是,請自己格式化字符串(不要忘記轉義特殊字符,如引號!!) –

0

如何在由';'分隔的字符串中寫入所有插入語句?並將此字符串傳遞給ExecuteNonQuery?

檢查錯誤只是比較插入的次數與受影響的是的ExecuteNonQuery返回

+0

您也可以創建一個存儲過程,它接收XML參數 –