簡體   English   中英

如何在 asp.net mvc 項目中管理我的 SQL 查詢腳本?

[英]How can I manage my SQL query script in asp.net mvc project?

我正在使用 Dapper 來處理數據。

這是一個代碼示例:

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 中編寫所有查詢 Product 腳本,在 Order.config 中編寫所有查詢 Order 腳本)然后我使用:

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

忽略downvoters。 SQL 應該總是在它自己的文件中。 這些文件的擴展名應該是 .sql,而不是 .config。 因此,它們將在 VS SQL 編輯器中進行編輯,這是一種真正的舒適。 我認為每個查詢都需要一個文件。 將不同的查詢分組在同一文件中並沒有任何好處。 我主張將這些文件放在使用它們的 .cs 文件旁邊,將您一起打開的文件和有一天您可能想要刪除的文件組合在一起。

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

如果這一切看起來像很多工作,它有點。 這就是為什么沒有人這樣做,但他們應該 :-) 抓住QueryFirst ,它會為您完成,除此之外還有很多其他事情。 免責聲明:我編寫了 QueryFirst。

如果您對數據庫具有完全訪問權限,則可以嘗試實施存儲過程來存儲 SQL 文本。 您需要做的就是在 Dapper 查詢中引用 Stored Proc 名稱並將命令類型設置為 StoredProcedure 就可以了,如下所示:

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

使用 SQL 參數而不是將值注入到查詢中是一件非常明智的事情,因為它可以防止 SQL 注入攻擊。 像這樣重新格式化您的查詢會有所幫助:

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

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

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

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

我訂閱了這樣的命令/查詢模式,所以我從來沒有遇到查詢存儲問題,因為每個類通常都有一個查詢。

編輯

如果您喜歡命令/查詢模式,我建議您查看MediatR,因為它是此類模式的一個很好的實現。

第二次編輯

我通過將 SQL 查詢添加到某種配置文件中來了解您正在嘗試做什么,但是如果可以的話,我想建議您不要這樣做。 在我的上一份工作中,所有 SQL 查詢都存儲在編譯到應用程序中的 XML 文件中。 這似乎是一種管理查詢的有效方法,但是一旦應用程序增長到甚至幾個 SQL XML 文件,我們就很難管理可以在何處找到哪些查詢,最終我們將查詢復制到多個 XML 文件中。 我們也遇到了很多直到運行時才被發現的拼寫錯誤和其他 XML 結構錯誤的問題,但我想您可以在任何字符串中包含拼寫錯誤,因此不一定會消失。 它最終變得一團糟,造成的問題比它解決的要多。

我相信讓 SQL 查詢文本盡可能接近需要它的代碼是一個更好的選擇,如果你對命名空間和組織查詢對象很聰明,你可以讓開發人員通過智能感知輕松找到查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM