9

我正在使用一个使用大量内联 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;    

    }
}

谢谢!

4

8 回答 8

8

我在一天中使用了很多 ADO.NET 查询,而且我一直使用第一种方法。第二种方法是一个有趣的想法,但如果您在使用它的代码中的另一个位置,编辑这些查询可能会很麻烦。这也使得在代码中的特定位置查看查询正在做什么变得更加困难。例子:

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

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

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

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

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

于 2012-10-05T16:11:09.393 回答
6

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

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

于 2012-10-05T16:08:57.337 回答
4

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

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

您可能需要下载不同的版本,具体取决于您正在开发的 .NET 框架的版本。

于 2012-10-05T16:22:45.907 回答
1

如果您绝对必须拥有“内联” sql 而不是存储过程(我已经为仅与数据库交互而不是拥有它的实用程序类型的应用程序这样做了),我建议将您的 SQL 放入嵌入式资源文件中。这将使您的查询更易于维护(尽管您仍然需要重新编译您的应用程序以进行更改)。

于 2012-10-05T16:27:36.867 回答
0

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

于 2012-10-05T16:21:18.547 回答
0

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

于 2012-10-05T16:08:30.623 回答
0

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

于 2012-10-05T16:11:28.487 回答
0

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

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

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

于 2016-05-30T12:48:19.017 回答