2017-07-04 41 views
0

,我想參數的集合添加到的SqlCommand我有這樣的代碼。如何在C#中查詢執行之前向SqlCommand添加參數集合?

public void AddParameters(Dictionary<string, object> parameters) 
{ 
    if (parameters == null) 
     return; 

    foreach(KeyValuePair<string, object> keyValue in parameters) 
    { 
     sqlCommand.Parameters.AddWithValue(keyValue.Key, keyValue.Value); 
    } 
} 

我想使它更有效率而不使用循環,因爲我可以有一個非常大的參數集合。有什麼方法可以用一個函數來添加整個集合嗎?

+3

的「單一功能」將其內部都有一個循環。那麼它以什麼方式與衆不同呢? – user5014677

+1

這個循環是否會降低您的表現? – Stefan

+3

你正在優化錯誤的東西。不關心微秒,但代碼安全。使用'AddWithValue'是不安全的,並且會導致性能(或其他)問題,因爲參數的類型必須從該值派生。 –

回答

3

只有這樣,才能「優化」那種情況下是已經有一個DbCommand實例與正確的命令文本/類型圍坐,並已增加了參數,你只需設置每回合.Value執行前反對連接。但是,如果您使用多個連接/線程,則需要仔細同步,因此需要小心謹慎地進行。最終,什麼你在這裏做將是沒什麼比跟一個數據庫,這樣的延遲:很可能,這僅僅是過早的優化和犛牛剃鬚 - 意思是:你可能會覺得你在這裏取得了一些有用的東西,但你實際上只是在花費你的時間。

0

可以使用的AddRange方法來改善略的表現:

public void AddParameters(SqlParameter[] parameters) 
    { 
     if (parameters == null) 
      return; 
     sqlCommand.Parameters.AddRange(parameters); 

    } 
+1

所有做的採集參數是*隱藏*循環... –

+0

@MarcGravell不知道......剛看到這個question..https:/ /stackoverflow.com/questions/9836471/why-is-addrange-faster-than-using-a-foreach-loop –

+2

確實,但這裏有兩個問題; a:當我們將db延遲添加到混合中的時候,我們所做的其他一切都將是**不相關的邊際數據**,b:我會打賭你實際上**在這裏添加了**時間(未刪除它),通過'ToArray' - 所以現在它循環兩次*而不是一次,*和*做一個堆分配/複製。 –

1

我不喜歡的幾件事情

  1. 爲什麼你需要一個public方法參數添加到個人SqlCommand即應根本不是一個領域,而應該在你使用它的地方創建。這太容易出錯。
  2. 在優化錯誤的東西。不關心微秒,但代碼安全。使用AddWithValue是不是安全,並可能導致性能(或其他)問題,因爲參數的類型必須從價值

衍生如果你可以用這樣的方法,但有一點好處:

void AddParameters(params SqlParameter[] parameters) 
{ 
    if (parameters == null || parameters.Length == 0) 
     return; 

    sqlCommand.Parameters.AddRange(parameters); 
} 

params關鍵字允許以這種方式來使用它:

SqlParameter pararmeter = new SqlParameter("@Column", SqlDbType.Int); 
pararmeter.Value = 1234; 
AddParameters(pararmeter); 
相關問題