2010-10-27 58 views
3

解決方案1:什麼是調用多個存儲過程的最快代碼?

foreach (var item in itemList) 
{ 
    myContext.ExecuteStoreCommand("EXEC MyProc {0};", item); // Insertion 
} 

解決方案2:

StringBuilder sb = new StringBuilder(); 
foreach (var item in itemList) 
{ 
    sb.AppendLine(String.Format("EXEC MyProc {0};", item)); // Insertion 
} 
myContext.ExecuteStoreCommand(sb.ToString()); 
+5

這些東西被稱爲**存儲**程序 - **不**存儲程序.... – 2010-10-27 14:04:33

+0

混淆似乎是SQL服務器和實體框架4.0。前者在社區中稍微有名;-)。但STORED過程和STORE命令仍然不同。 – 2010-10-27 14:39:30

回答

8

其次是更快(一次調用數據庫而不是多次),首先是更安全,因爲它可以防止SQL注入。

5

都是秒一個受sql injection,這是肯定的

通過讀取thisthis,我同意kekekela

+0

第一個沒有使用參數化命令。 – heisenberg 2010-10-27 14:07:47

+0

@Justin - 有關ExecuteStoreCommand的文檔指出OP的第一條語句事實上會生成參數化命令:http://msdn.microsoft.com/en-us/library/ee358758.aspx – JeremyDWill 2010-10-27 14:15:35

+0

@kekekela,我更新了我的答案 – Fredou 2010-10-27 14:15:39

2

我猜想解決方案2是因爲您的應用程序和數據庫之間的I/O較少。如果速度是你所關心的,你可以通過調試System.Diagnostics.Stopwatch utility來檢查自己。

+0

測試結果:解決方案2的速度是解決方案1的兩倍* – 2010-10-27 14:12:17

+0

似乎很多人懷疑它會是。話雖如此,我強烈建議您考慮其他人關於安全/ sql注入風險的觀點。僅僅因爲它是最快的方式並不一定意味着它是最好的方式。 – 2010-10-27 14:16:19

1

這聽起來像是一個很容易測試的小型優化的機會。

可能它們非常接近相同的速度。

+0

測試結果:解決方案2的速度是解決方案1的兩倍* – 2010-10-27 14:13:42

+0

我們正在談論1ms還是2ms? – codekaizen 2010-10-27 14:24:29

3

解決方案2是更快它只是myContext.ExecuteStoreCommand從方法,以便減少開銷單個呼叫通過context對象

+0

測試結果:解決方案2的速度比解決方案1快兩倍 – 2010-10-27 14:12:41

1

你沒有提到的一個電話。

使用存儲過程的名稱作爲CommandText,將CommandType設置爲CommandType.StoredProcedure,並正確添加參數來準備一個SqlCommand。

除了不使用即席查詢(每次都必須重新進行修改)的性能提升之外,您還可以將大部分當前的SQL注入問題扼殺在萌芽狀態。

相關問題