2012-10-05 57 views
8

我正在使用一個使用大量內聯SQL查詢的asp.net網站......並且我想知道是否最好在運行時創建內聯查詢:內聯SQL查詢的最佳實踐

int i = 500; 

    using (SqlConnection conn = new SqlConnection(connStr)) 
    { 
     SqlCommand com = new SqlCommand(conn); 
     ... 
     com.CommandText = "select from table where column < @parameter"; 
     ... 
    } 

或有一個類來保存應用程序所需的所有查詢。類似這樣的:

class SqlQueries 
{ 
    private string query1 = 
      "select * from tblEmployees where EmployeeName = @EmployeeName"; 

    private string query2 = 
      "select * from tblVacation where EmployeeName = @EmployeeName"; 

    public string Query(string s) 
    { 
     string str = string.Empty; 

      switch (s) 
      { 
       case "query1": 
        str = query1; 
        break; 
       case "query2": 
        str = query2; 
        break; 
      }  

    return str;  

    } 
} 

謝謝!

+1

如果您決定採用間接方法編號2,那麼我會建議創建一個由包含SQL的查詢名稱索引的字典。然後,您可以使用字典初始值設定程序在源代碼中以類似於表格的方式列出所有查詢。你目前的方法是冗長的,容易出現複製粘貼錯誤(目前至少有一個將被編譯器發現)。 'new Dictionary {{「query1」,「select * ...」},{「query2」,「select * ...」}};' –

+0

謝謝大家!太糟糕了,我不能選擇多個答案:( – user1481183

回答

7

我在我的日子裏使用了很多ADO.NET查詢,並且我總是使用第一種方法。第二種方法是一個有趣的想法,但如果你在使用它的代碼的另一個地方,編輯這些查詢可能會很麻煩。這也使得查看代碼中特定位置查詢的效果變得困難。例如:

string sql = "Update User set age = @age where UserId = @UserId"; 

告訴開發商發生了什麼,而:

string sql = SqlQueries.Query("updateAge"); 

葉什麼表的問題/列正在更新。另外,第一個,你確切知道需要添加哪些參數。

如果你正在寫在幾個地方此查詢可能改變的事情

0

我認爲只要不在幾個地方重複查詢就可以「內聯」。如果這開始發生,那麼你可能想要開始創建查詢類。

5

將文字直接放入方法並不可怕,只要您每次運行該查詢時總是調用相同的方法即可。但是,如果要將該字符串文字複製到代碼中的多個位置,則常量是絕對的首選。但是,不要在第二個示例中將字符串作爲Query方法的參數,而應該使用枚舉值。但是,如果您使用的是您描述的第二種方法,那麼我會問您爲什麼不只是開始使用存儲過程呢?

+1

存儲特效的好點 –

+0

@Steven Doggart - 在我的情況下,有兩個原因:有太多的管理權限給數據庫(誰不應該有),以及將查詢保持在源控制之下。 – user1481183

0

在這兩種情況下,你最終建立/獲取String,你會傳遞給CommandText。所以不會有這樣的區別。您需要考慮的唯一事情是如何維護代碼或其他人如何理解您的代碼。

0

如果您打算使用內聯SQL,至少不要將其放入網頁代碼中,因爲在進行數據庫更改時,如果知道它會影響它,將會很痛苦。將所有查詢放在一個類中可能有點雜亂無章,但如果按功能類(如業務對象的經理類)對它們進行分組,它可能更容易處理。

4

我會推薦使用存儲過程作爲比硬編碼內聯查詢更好的解決方案。如果您必須稍後更改查詢,則不必重新構建應用程序,因此可以修復查詢中的錯誤,而無需部署整個應用程序。你在那裏的第二個選項是等待發生的維護噩夢。當你有一個或兩個查詢時,它看起來非常好,但當你有幾十或幾百個查詢時,它看起來會更難看。您的代碼看起來像它的C#,所以我會建議您檢查出微軟企業庫,

http://msdn.microsoft.com/en-us/library/ff632023.aspx

您可能需要根據您與開發的.NET Framework是什麼版本下載不同版本。

0

如果你絕對必須有「內聯」 SQL,而不是存儲過程(我已經這樣做了實用型應用程序,僅僅與數據庫交互,而不是自己吧),我建議把你的SQL變成了embedded resource file。這將使您的查詢更容易維護(儘管您仍然需要重新編譯應用程序以進行更改)。

0

如果您的查詢超過一行或兩行,您應該考慮將它們放在自己的.sql文件中。將文件上的構建操作設置爲嵌入式資源,並通過調用GetManifestResourceStream()來訪問它。這樣,你就可以將你的sql提升到合適語言的狀態,語法高亮,驗證和智能感知(當你將VS連接到你的數據庫時)。不用說,這極大地方便了維護。

如果這一切看起來像一個麻煩,抓住我的VS擴展,QueryFirst。使用提供的模板創建您的.sql文件,它們將自動連接進行編譯。但是你不會在意,因爲你只需通過生成的類訪問查詢。

Sql是我能想到的唯一的計算機語言,我們接受在字符串文字中看到切碎。這應該是一個醜聞。