2017-01-09 24 views
-1

現在我用小巧玲瓏來處理數據我如何管理我的SQL查詢腳本在asp.net mvc的項目

這樣的代碼:

using(var connection = new SqlConnection(ConfigurationManager.AppSettings["MyConnectString"]) 
{ 
    var sql = string.Format(
     @"SELECT [Column1] 
      FROM [MyTable] 
      WHERE [Column3] > {0} 
       AND [Column4] < {1}" 
     , myValue1 
     , myValue2 
    ); 
    var result = connection.Query<long>(sql).ToList(); 
} 

我的項目會寫很多sql腳本這樣的上方。

我想編寫腳本文件(也許QueryAccount.config,QueryOrder.config,(XML格式)...或者別人好......)

然後我可以從文件加載腳本.. 。


我想是我寫在文件中的腳本,然後我寫的同一類 文件。 (如:我寫Product.config所有查詢產品的腳本,並在Order.config所有訂單查詢腳本) 然後我使用像

var cmd = MyCommandManager.GetScript("QueryProduct"); 
cmd.SetParam("@ProductId", 123); 
cmd.SetParam("@InvoicingDate", DateTime.Now(-7)) 
... 

腳本文件,如:

SELECT [ProductName] 
FROM [Product] 
WHERE [ProductId] = @ProductId 
    AND [InvoicingDate] = @InvoicingDate 
+4

不要這樣做 - 你正在尋求SQL注入攻擊! –

+3

你爲什麼要這麼做? –

+0

您應該爲每個腳本創建存儲過程,然後使用參數調用這些存儲過程。它會避免sql注入。 –

回答

1

如果您可以完全訪問數據庫,您可以嘗試執行Stored Procedure來存儲SQL文本。所有你需要做的是在小巧玲瓏的查詢引用存儲過程的名稱和命令類型設置爲StoredProcedure,你會好到哪裏去,像這樣:

using(var cn = new SqlConnection("MyConnectionString")) 
{ 
    cn.Open(); 
    return cn.Query<MyModel>("MyProcName", new { Parameter1 = myValue1, Parameter2 = myValue2 }, commandType: CommandType.StoredProcedure); 
} 

使用SQL Paramters而不是注入值代入你的查詢是一件非常聰明的事情,因爲它可以防止SQL注入攻擊。重新格式化您的查詢,就像這樣會有所幫助:

@"SELECT [Column1] 
    FROM [MyTable] 
    WHERE [Column3] > @Parameter1 
    AND [Column4] < @Parameter2" 

請注意,我的參數名稱與上面的縮略調用相匹配。但是,當我不使用存儲過程時,通常會在類的頂部創建一個private const string,該類引用查詢以查找「存儲」。

public class QueryClass 
{ 
    private const string query = "SELECT * FROM Table1"; 

    public IEnumerable<MyModel> CallQuery() 
    { 
     // Dapper Query Details 
    } 
} 

我訂閱Command/Query Pattern like this one,所以我從來沒有這樣的詢問存儲的問題,因爲每個類通常有一個查詢。

編輯

如果你喜歡的命令/查詢模式,我建議你看看MediatR,因爲它是一個很好的實現這種模式的。

第二個編輯

我看到你正在嘗試通過將SQL查詢某種配置文件的做,但是如果我能,我想建議你對抗。在我上一份工作中,所有SQL查詢都存儲在編譯到應用程序中的XML文件中。這似乎是一種管理查詢的有效方法,但是一旦應用程序增長到幾個SQL XML文件,我們就很難管理哪些查詢可以在哪裏找到,並且最終我們將查詢複製到多個XML文件中。我們在排版錯誤和其他XML結構錯誤方面也存在很多問題,這些錯誤直到運行時才被捕獲,但我想你可以在任何字符串中輸入錯字,這樣就不一定會消失。它最終會變得一團糟,造成比解決問題更多的問題。

我相信讓SQL查詢文本儘可能接近需要它的代碼是更好的選擇,如果您對命名空間和組織查詢對象很聰明,可以使開發人員更容易地查找查詢通過intellisense。

0

忽略downvoters。 SQL應始終位於其自己的文件中。這些文件應該具有擴展名.sql,而不是.config。因此,它們將在VS SQL編輯器中進行編輯,非常舒適。你想每個查詢我想一個文件。將同一個文件中的不同查詢分組,不會獲得任何結果。我主張將這些文件放在使用它們的.cs文件旁邊,將您一起打開的文件分組在一起,以及您可能希望一天刪除的文件。

創建後,右鍵單擊解決方案資源管理器中的.sql屬性 - >構建操作 - >嵌入式資源。然後,在您的MyCommandManager.GetScript()方法中,使用GetManifestResourceStream()來訪問查詢文本。與存儲過程相比,這具有巨大的優勢,即使用調用代碼編譯查詢,因此您不必擔心同步存儲過程的版本和應用程序。

如果所有這些看起來像很多工作,它是有點。這就是爲什麼沒有人這樣做,但他們應該:-)抓住QueryFirst,它會爲你和其他許多人做。免責聲明:我寫了QueryFirst。

相關問題