[英]How can I use SQL Server CE for my ASP.net MVC membership/authorization project?
[英]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.