我有一个基于MVC4的项目,带有一些SQL查询。它们当前存储在项目资源(* .resx)中,但在资源编辑器中编辑查询非常困难。
是否有专门的SQL查询存储?我应该在哪里存储我的查询?
答案 0 :(得分:3)
您可以将查询作为存储过程放入数据库中。这使您可以封装数据库逻辑 - “关注点分离”。
答案 1 :(得分:1)
不,SQL查询没有专门的存储空间。
资源文件听起来有点不寻常,我宁愿把它们放在代码中的常量字符串中,封装在数据层中。在使用应用参数的SQL查询的每个方法中都可以使用
但是我真的建议避免普通的旧SQL,而是使用Entity Framework或LINQ2SQL。
答案 2 :(得分:1)
我用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
目录中的所有Queries
个文件汇编为一个类。
答案 3 :(得分:0)
为什么不将Entity Framework用作ORM?
这是与ASP.NET MVC链接的绝佳技术。
此外,您可以将SQL移动到MSSQL中的存储过程。 在这种情况下,我建议使用Database Project将SQL存储在您的解决方案中。
无论如何在代码或资源中存储SQL都不是一个好习惯。