我看了很多問題,但很明顯我的SO-fu沒有達到任務,所以在這裏。我試圖有效地使用預先準備好的語句,而不僅僅是指參數化單個語句,而是編譯一個重複使用多次的語句。我的問題在於參數和重用以及如何正確實施。如何在C#.NET(SQL Server)中正確有效地重用預準備語句?
一般來說,我遵循這一程序(人爲的例子):
SqlConnection db = new SqlConnection(...);
SqlCommand s = new SqlCommand("select * from foo where [email protected]", db);
s.Parameters.Add("@a", SqlDbType.VarChar, 8);
s.Prepare();
...
s.Parameters["@a"] = "bozo";
s.Execute();
超,工程。但是,我不想在每次運行此查詢時都執行所有這些步驟(或後四個步驟)。這似乎是抵消了準備好的陳述的整個想法。在我看來,我只需要改變參數並重新執行,但問題是如何做到這一點?
我試過s.Parameters.Clear()
,但是這實際上消除了參數本身,而不僅僅是價值,所以我基本上是需要重新Add
的參數,並再次重新Prepare
,這似乎打破整個點爲好。不用了,謝謝。
在這一點上,我剩下迭代通過s.Parameters
並將它們全部設置爲null或其他值。 這是正確的嗎?不幸的是,在我目前的項目中,我有大約15個參數的查詢需要執行〜每次運行10,000次。我可以將這個迭代轉換成一種方法,但是想知道是否有更好的方法來做到這一點(沒有存儲過程)。
我目前的解決方法是擴展方法SqlParameterCollection.Nullify
,它將所有參數設置爲null,這對我的情況來說很好。我只是在執行後運行它。
我發現了一些幾乎相同,但(恕我直言)沒有答案的問題:
Prepared statements and the built-in connection pool in .NET
SQLite/C# Connection Pooling and Prepared Statement Confusion(!塞爾是如此接近接聽)
最佳答案我能找到的是( 1)以上常識和(2)本頁:
http://msdn.microsoft.com/en-us/magazine/cc163799.aspx
奇怪的是,我在編輯框中的第一個鏈接之後有一個換行符,但它沒有使它進入呈現的輸出...固定。 – Josh
把它放在一個方法上,傳遞一個SqlParameters集合給它並重用其餘的。 :) –
請閱讀http://msdn.microsoft.com/en-us/magazine/ee236412.aspx,並確保準確定義參數的大小。這應該有助於提高性能。 (當然除了storedprocedure) – Steve