【问题标题】:Best practices for inline SQL queries内联 SQL 查询的最佳实践
【发布时间】:2012-09-26 19:56:48
【问题描述】:

我正在使用一个使用大量内联 SQL 查询的 asp.net 网站...我想知道是否最好即时创建内联查询:

int i = 500;

    using (SqlConnection conn = new SqlConnection(connStr))
    {
        SqlCommand com = new SqlCommand(conn);
        ...
        com.CommandText = "select from table where column < @parameter";
        ...
    }

或者有一个类来保存应用程序所需的所有查询。像这样的:

class SqlQueries
{
    private string query1 = 
          "select * from tblEmployees where EmployeeName = @EmployeeName";

    private string query2 = 
          "select * from tblVacation where EmployeeName = @EmployeeName";

    public string Query(string s) 
    { 
        string str = string.Empty;

            switch (s) 
            {
                case "query1":
                    str = query1; 
                    break; 
                case "query2":
                    str = query2; 
                    break;
            }     

    return str;    

    }
}

谢谢!

【问题讨论】:

  • 如果您决定采用 2 号间接方法,那么我建议创建一个字典,该字典由包含 SQL 的查询名称索引。然后,您可以使用字典初始化程序在源代码中以几乎类似表格的方式列出所有查询。您当前的方法很冗长并且容易受到复制粘贴错误的影响(目前至少有一个会被编译器发现)。 new Dictionary&lt;string, string&gt; { { "query1", "select * ..." }, { "query2", "select * ..." } };
  • 谢谢大家!太糟糕了,我不能选择多个答案:(

标签: c# asp.net sql-server visual-studio


【解决方案1】:

我用过很多 ADO.NET 查询,我一直使用第一种方法。第二种方法是一个有趣的想法,但是如果您在使用它的代码中的另一个位置,编辑这些查询可能会很麻烦。它还使查看查询在代码中的特定位置执行的操作变得更加困难。示例:

string sql = "Update User set age = @age where UserId = @UserId";

告诉开发人员发生了什么,同时:

string sql = SqlQueries.Query("updateAge");

留下关于正在更新哪些表/列的问题。此外,对于第一个,您确切知道需要添加哪些参数。

如果您在几个可能会改变事情的地方编写此查询

【讨论】:

    【解决方案2】:

    将文字直接放在方法中并不可怕,只要您每次要运行该查询时始终调用相同的方法即可。但是,如果您要将字符串文字复制到代码中的多个位置,那么绝对首选常量。但是,在第二个示例中,不应将字符串作为 Query 方法的参数,而应采用枚举值。

    但是,如果您使用的是您描述的第二种方法,我会问您为什么不直接开始使用存储过程?

    【讨论】:

    • @Steven Doggart - 就我而言,有两个原因:拥有数据库管理员权限的人太多(谁不应该拥有),以及将查询置于源控制之下。
    【解决方案3】:

    我建议使用存储过程作为比硬编码内联查询更好的解决方案。如果您以后必须更改查询,则不必重新构建应用程序,因此可以修复查询中的错误,而无需部署整个应用程序。您拥有的第二个选项是等待发生的维护噩梦。当你有一个或两个查询时,这一切看起来都很好,但是当你有几十个或几百个查询时,它开始看起来有点难看。您的代码看起来像是 c#,因此我建议您查看 Microsoft Enterprise Library,

    http://msdn.microsoft.com/en-us/library/ff632023.aspx

    根据您正在开发的 .NET 框架的版本,您可能需要下载不同的版本。

    【讨论】:

      【解决方案4】:

      如果您绝对必须拥有“内联” sql 而不是存储过程(我已经为仅与数据库交互而不是 拥有 的实用程序类型的应用程序做到了这一点em> it),我建议将您的 SQL 放入embedded resource file。这将使您的查询更易于维护(尽管您仍需要重新编译您的应用以进行更改)。

      【讨论】:

        【解决方案5】:

        我认为将查询“内联”是可以的,只要它们不在多个地方重复即可。如果这种情况开始发生,那么您可能需要开始创建查询类。

        【讨论】:

          【解决方案6】:

          在这两种情况下,您最终都会构建/获取String,您将传递给CommandText。所以不会有这样的区别。在您的案例中,您唯一需要考虑的是您将如何维护代码或其他人将如何理解您的代码。

          【讨论】:

            【解决方案7】:

            如果您要使用内联 SQL,至少不要将它放在网页代码中,因为当您更改数据库以了解它的影响时,这会很痛苦。将所有查询放在一个类中可能有点杂乱无章,但如果您按功能类(如业务对象的管理器类)对它们进行分组,可能会更容易处理。

            【讨论】:

              【解决方案8】:

              如果您的查询超过一两行,您应该考虑将它们放在自己的 .sql 文件中。将文件上的构建操作设置为嵌入资源,并通过调用 GetManifestResourceStream() 来访问它。这样,您将 sql 提升到适当语言的状态,并具有语法突出显示、验证和智能感知(当您将 VS 连接到数据库时)。不用说,这极大地方便了维护。

              如果这一切看起来很麻烦,请使用我的 VS 扩展程序,QueryFirst。使用提供的模板创建您的 .sql 文件,它们将自动连接以进行编译。但您不会在意,因为您只需通过生成的类访问查询。

              Sql 是我能想到的唯一一种我们可以接受的计算机语言,它可以被分割成字符串文字。这应该是个丑闻。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-01-06
                • 1970-01-01
                • 1970-01-01
                • 2013-05-10
                • 1970-01-01
                • 1970-01-01
                • 2013-02-17
                • 2023-03-24
                相关资源
                最近更新 更多