いくつかの SQL クエリを含む MVC4 ベースのプロジェクトがあります。現在、プロジェクト リソース (*.resx) に保存されていますが、リソース エディター内でクエリを編集するのは非常に困難です。
特殊な SQL クエリ ストレージはありますか? クエリはどこに保存すればよいですか?
いくつかの SQL クエリを含む MVC4 ベースのプロジェクトがあります。現在、プロジェクト リソース (*.resx) に保存されていますが、リソース エディター内でクエリを編集するのは非常に困難です。
特殊な SQL クエリ ストレージはありますか? クエリはどこに保存すればよいですか?
クエリをデータベースにストアド プロシージャとして配置できます。これにより、データベース ロジックのカプセル化、つまり「関心の分離」が実現します。
T4で解決しました。これQueries
で、プロジェクトとその中にディレクトリがSQLGenerator.tt
できました。これが私のテンプレートのソースコードです:
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#var sqlScriptsContent = ReadSql(); #>
namespace MathApplication.SQL
{
public class Queries
{
<# foreach(var file in sqlScriptsContent) { #>
public string <#= file.Key #> = @"<#= file.Value #>";
<# } #>
}
}
<#+
public Dictionary<string, string> ReadSql() {
var filePaths = Directory.GetFiles(Host.ResolvePath("."));
var result = new Dictionary<string, string>();
foreach (var filename in filePaths) {
if (filename.EndsWith(".sql")) {
result[Path.GetFileNameWithoutExtension(filename)] = System.Text.RegularExpressions.Regex.Replace(File.ReadAllText(filename), @"\s+", " ").Replace("\"", "'");
}
}
return result;
}
#>
このコードは、ディレクトリ内のすべての*.sql
ファイルを1つのクラスにアセンブルします。Queries
いいえ、SQL クエリ専用のストレージはありません。
リソース ファイルは少し変わっているように聞こえますが、コード内の定数文字列に入れ、データレイヤーにカプセル化したいと思います。パラメータが適用される SQL クエリを使用する各メソッド内で可能です。
ただし、単純な古い SQL を避け、代わりに Entity Framework または LINQ2SQL を使用することを強くお勧めします。
Entity Framework を ORM として使用しないのはなぜですか?
ASP.NET MVC と連携した優れた技術です。
また、SQL を MSSQL のストアド プロシージャに移動することもできます。この場合、データベース プロジェクトを使用して SQL をソリューションに格納することをお勧めします。
いずれにせよ、SQL をコードやリソースに格納することはあまり良い方法ではありません。