首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在asp.net mvc项目中管理我的SQL查询脚本?

问如何在asp.net mvc项目中管理我的SQL查询脚本?
EN

Stack Overflow用户
提问于 2017-01-09 10:27:15
回答 2查看 1.2K关注 0票数 0

我正在使用Dapper处理数据。

下面是一个代码示例:

代码语言:javascript
复制
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编写所有查询顺序脚本),然后使用如下代码:

代码语言:javascript
复制
var cmd = MyCommandManager.GetScript("QueryProduct");
cmd.SetParam("@ProductId", 123);
cmd.SetParam("@InvoicingDate", DateTime.Now(-7))
...

文件中的脚本如下:

代码语言:javascript
复制
SELECT [ProductName]
FROM [Product]
WHERE [ProductId] = @ProductId
  AND [InvoicingDate] = @InvoicingDate
EN

回答 2

Stack Overflow用户

发布于 2017-01-09 17:08:35

忽略不看好的人。SQL应该始终在它自己的文件中。这些文件的扩展名应该是.sql,而不是.config。因此,它们将在VS SQL编辑器中进行编辑,这是一种真正的安慰。我想您希望每个查询都有一个文件。将不同的查询分组到同一个文件中不会获得任何好处。我主张将这些文件放在使用它们的.cs文件旁边,将您一起打开的文件和您可能希望某天一起删除的文件组合在一起。

创建后,右键单击解决方案资源管理器中的.sql,属性-->构建操作-->嵌入式资源。然后,在MyCommandManager.GetScript()方法中,使用GetManifestResourceStream()访问查询文本。与存储过程相比,这有一个巨大的优势,即您的查询是用调用代码编译的,因此您不必担心同步存储过程和应用程序的版本。

如果所有这一切看起来像是大量的工作,那么它确实是这样的。这就是为什么没有人这样做的原因,但他们应该:-)抓取QueryFirst,它将为您完成,除此之外还有很多其他事情。免责声明:我写了QueryFirst。

票数 3
EN

Stack Overflow用户

发布于 2017-01-09 10:48:27

如果您拥有对数据库的完全访问权限,则可以尝试实现一个Stored Procedure来存储SQL文本。您所需要做的就是在Dapper查询中引用存储的Proc名称,并将命令类型设置为StoredProcedure,这样就可以了:

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

使用SQL参数而不是将值注入到查询中是非常明智的做法,因为它可以防止SQL注入攻击。像这样重新格式化您的查询会有所帮助:

代码语言:javascript
复制
@"SELECT [Column1]
  FROM [MyTable]
  WHERE [Column3] > @Parameter1
  AND [Column4] < @Parameter2"

请注意,我的参数名与上面的dapper调用相匹配。但是,当我不使用存储过程时,我通常会在引用“存储”查询的类的顶部创建一个private const string。

代码语言:javascript
复制
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让devs很容易找到查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41540165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档