2008-11-06 55 views
4

將我的SQL查詢存儲在全局資源文件中而不是將其存儲在我的代碼隱藏文件中是一個好主意嗎?我知道存儲過程將是一個更好的解決方案,但我沒有這個項目的奢侈品。ASP.NET - 在全局資源文件中存儲SQL查詢?

我不希望查詢遍佈我的網頁,並認爲中央存儲庫會是一個更好的主意。

回答

7

資源文件通常用於本地化。但是一個字符串只是一個字符串,並且你真的想將一個資源文件中的舊字符串發送到你的數據庫嗎?

我完全同意其他人應該使用linq或typed數據集等。就我個人而言,這些年來我只需求助於少數幾次文本查詢,而當我這樣做時,通常就像下面這樣:

您設置了一個小框架,然後您需要做的就是維護一個Xml文件。一個特定的xml文件比資源dll更容易管理和部署。您還有一個知名的地方(存儲庫),存儲Sql Queries和一些關於它們的元數據,而不僅僅是一些命名約定。

永遠不要低估(簡單)類在字符串文字上的效用。一旦你開始使用這個課程,你就可以添加一些東西,你只需要簡單的字符串就可以做到。


記事本編譯器,所以道歉,如果這不是100%。這只是一切如何互動的簡圖。

public static class SqlResource 
{ 
    private static Dictionary<string,SqlQuery> dictionary; 

    public static void Initialize(string file) 
    { 
     List<SqlQuery> list; 

     // deserialize the xml file 
     using (StreamReader streamReader = new StreamReader(file)) 
     { 
      XmlSerializer deserializer = new XmlSerializer(typeof(List<SqlQuery>)); 
      list = (List<SqlQuery>)deserializer.Deserialize(streamReader); 
     } 
     dictionary = new Dictionary<string,SqlQuery>(); 
     foreach(var item in list) 
     { 
      dictionary.Add(item.Name,item); 
     } 
    } 
    public static SqlQuery GetQueryByName(string name) 
    { 
     SqlQuery query = dictionary[name]; 

     if(query == null) 
      throw new ArgumentException("The query '" + name + "' is not valid."); 

     if(query.IsObsolete) 
     { 
      // TODO - log this. 
     } 
     return query; 

    } 
} 

public sealed class SqlQuery 
{ 
    [XmlAttributeAttribute("name")] 
    public bool Name { get; set; } 

    [XmlElement("Sql")] 
    public bool Sql { get; set; } 

    [XmlAttributeAttribute("obsolete")] 
    public bool IsObsolete { get; set; } 

    [XmlIgnore] 
    public TimeSpan Timeout { get; set;} 

    /// <summary> 
    /// Serialization only - XmlSerializer can't serialize normally 
    /// </summary> 
    [XmlAttribute("timeout")] 
    public string Timeout_String 
    { 
     get { return Timeout.ToString(); } 
     set { Timeout = TimeSpan.Parse(value); } 
    } 
} 

XML文件看起來像

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfSqlQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SqlQuery name="EmployeeByEmployeeID" timeout="00:00:30" > 
     <Sql> 
SELECT * From Employee WHERE EmployeeID = @T0  
     </Sql> 
    </SqlQuery> 
    <SqlQuery name="EmployeesForManager" timeout="00:05:00" obsolete="true" > 
     <Sql> 
SELECT * From Employee WHERE ManagerID = @T0  
     </Sql> 
    </SqlQuery> 
</ArrayOfSqlQuery> 
0

我會用tableadapters查找強類型數據集,並讓tableadapters處理所有查詢。當你使用它時,你永遠不會回頭。

只需在您的解決方案中添加數據集,爲表添加連接和表適配器,然後開始構建所有查詢(更新,選擇,刪除,搜索等)並在代碼後面輕鬆處理它。

+0

我的大部分數據訪問都是通過SubSonic進行的,並且是強類型的。但是,我有時需要寫出非常複雜的查詢。 – 2008-11-06 22:41:50

0

好吧,我會試着再次回答,現在當我有更多的信息。

我會做一個查詢類,將所有querystrings作爲共享屬性或函數,可以很好地命名爲易於使用。

0

我和一些喜歡在資源文件中編寫查詢的開發人員處於相同的情況。我們使用亞音速,我寧願使用存儲過程,而不使用直接查詢。

儘管很糟糕,一種選擇是將這些查詢放置在配置文件中並在需要時讀取,但這是一個非常糟糕的選項,如果每個人都不能使用存儲過程達成一致,我們可能會使用它。

0

您可以使用XML配置文件使用存儲過程的名稱太多關聯。我正在爲當前的C#項目做這件事。 「查詢」將定義要調用的過程。

由於一些數據庫引擎不支持存儲的查詢,這並不總是一個選項。

有時對於小型項目,可以使用參數化SQL查詢(不要連接字符串)。對於select語句尤其如此。

視圖也可以用於選擇而不是存儲過程。

Rob