我需要保存幾列記錄的列表。我有兩種方法可以做到這一點。使用臨時表進行多次往返?
我可以簡單地創建該元素的列表,並從代碼中多次執行存儲過程
的foreach(在lstTestInfo TestInfo試驗) {//執行存儲過程}
我可以建立一個字符串,並將其發送到數據庫,在那裏我可以把它分解,並將其存儲在一個臨時表,並用單次往返
雖然這不是一個嚴重的問題......我想要一些見解。 謝謝!
我需要保存幾列記錄的列表。我有兩種方法可以做到這一點。使用臨時表進行多次往返?
我可以簡單地創建該元素的列表,並從代碼中多次執行存儲過程
的foreach(在lstTestInfo TestInfo試驗) {//執行存儲過程}
我可以建立一個字符串,並將其發送到數據庫,在那裏我可以把它分解,並將其存儲在一個臨時表,並用單次往返
雖然這不是一個嚴重的問題......我想要一些見解。 謝謝!
有兩種方法可以查看它。 1.做什麼比較容易vs 2.做什麼是正確的? 第一種選擇很簡單,但不是那種能給你一個長期解決方案的選項。你遲早會意識到,這不是正確的表演,也不是最簡單的做法。當你在一臺機器上安裝了很少的用戶和一切設備時,這可能會很好。
然而,第二種方法不僅減少了電匯,還最大限度地減少了對數據庫的調用。你正在談論執行一個SP,這意味着連接將會涉及到。每個對DB的調用都是開銷,我們應該儘量減少這個。如果您的負載平衡環境具有n層部署,如果您使用選項#1進行操作,則會在另一臺服務器上調用數據庫。
我會選擇選項2.它會花更多的時間來實現,但會在以後節省我的努力。
保持簡單。從最容易實現的解決方案開始,我認爲這是第一個。
然後,您可以測試性能是否足夠好,如果您遇到問題,請重新考慮實施。
如果您嘗試實現第二個選項,則字符串本身的長度可能會受到阻礙。只有這麼多的數據你發送。更多解決方案有效的數據越少。
通過對數據庫進行多次調用(解決方案1)還有一項開銷。假設多個單元依賴於其他單元的更新,您也可能會搞砸交易。
爲您自己決定,它是您需要進行的折衷。
你不能從你的應用程序創建一個插入/更新語句並執行它嗎?除非你堅持寫一個proc來做插入/更新 – ViSu
我會保持它簡單的使用單個連接和命令來有效地傳遞數據。可以使用其他複雜的技術,但我不認爲會提供太多的好處,並會混亂你的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();
}
}
}
}
這是一個常問的問題,有很多可能的答案。例如,你有沒有考慮[多個可選參數? This article by Joe Celko涵蓋此選項,並提供鏈接到Erland Sommarskog關於該主題的'經典'文章。
其實我一直在做第一種方法......但現在我關心性能...... – Paras