2011-09-06 57 views
0

我需要保存幾列記錄的列表。我有兩種方法可以做到這一點。使用臨時表進行多次往返?

  1. 我可以簡單地創建該元素的列表,並從代碼中多次執行存儲過程

    的foreach(在lstTestInfo TestInfo試驗) {//執行存儲過程}

  2. 我可以建立一個字符串,並將其發送到數據庫,在那裏我可以把它分解,並將其存儲在一個臨時表,並用單次往返

有插入

雖然這不是一個嚴重的問題......我想要一些見解。 謝謝!

回答

1

有兩種方法可以查看它。 1.做什麼比較容易vs 2.做什麼是正確的? 第一種選擇很簡單,但不是那種能給你一個長期解決方案的選項。你遲早會意識到,這不是正確的表演,也不是最簡單的做法。當你在一臺機器上安裝了很少的用戶和一切設備時,這可能會很好。

然而,第二種方法不僅減少了電匯,還最大限度地減少了對數據庫的調用。你正在談論執行一個SP,這意味着連接將會涉及到。每個對DB的調用都是開銷,我們應該儘量減少這個。如果您的負載平衡環境具有n層部署,如果您使用選項#1進行操作,則會在另一臺服務器上調用數據庫。

我會選擇選項2.它會花更多的時間來實現,但會在以後節省我的努力。

3

保持簡單。從最容易實現的解決方案開始,我認爲這是第一個。

然後,您可以測試性能是否足夠好,如果您遇到問題,請重新考慮實施。

+0

其實我一直在做第一種方法......但現在我關心性能...... – Paras

1

如果您嘗試實現第二個選項,則字符串本身的長度可能會受到阻礙。只有這麼多的數據你發送。更多解決方案有效的數據越少。

通過對數據庫進行多次調用(解決方案1)還有一項開銷。假設多個單元依賴於其他單元的更新,您也可能會搞砸交易。

爲您自己決定,它是您需要進行的折衷。

+0

你不能從你的應用程序創建一個插入/更新語句並執行它嗎?除非你堅持寫一個proc來做插入/更新 – ViSu

1

我會保持它簡單的使用單個連接和命令來有效地傳遞數據。可以使用其他複雜的技術,但我不認爲會提供太多的好處,並會混亂你的sproc。

public void UpdateUserItems(Guid userId, string[] items) 
{ 
    using (SqlConnection conn = new SqlConnection("connectionstring...")) 
    { 
     using (SqlCommand cmd = new SqlCommand("Insert Into UserItems(UserId, Items) values (@UserId, @Items)")) 
     { 
      conn.Open(); 
      cmd.Parameters.AddWithValue("@UserId", userId); 
      foreach(string item in items) 
      { 
       cmd.Parameters.AddWithValue("@Item", Item; 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
} 
1

這是一個常問的問題,有很多可能的答案。例如,你有沒有考慮[多個可選參數? This article by Joe Celko涵蓋此選項,並提供鏈接到Erland Sommarskog關於該主題的'經典'文章。