内联SQL查询的最佳实践

时间:2012-10-05 16:04:02

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

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

    }
}

谢谢!

8 个答案:

答案 0 :(得分:7)

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

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

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

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

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

如果您在多个可能改变事物的地方编写此查询

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

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