2012-10-05 59 views
8

我正在使用一个使用大量内联SQL查询的asp.net网站......并且我想知道是否最好在运行时创建内联查询:内联SQL查询的最佳实践

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;  

    } 
} 

谢谢!

+1

如果您决定采用间接方法编号2,那么我会建议创建一个由包含SQL的查询名称索引的字典。然后,您可以使用字典初始值设定程序在源代码中以类似于表格的方式列出所有查询。你目前的方法是冗长的,容易出现复制粘贴错误(目前至少有一个将被编译器发现)。 'new Dictionary {{“query1”,“select * ...”},{“query2”,“select * ...”}};' –

+0

谢谢大家!太糟糕了,我不能选择多个答案:( – user1481183

回答

7

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

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

告诉开发商发生了什么,而:

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

叶什么表的问题/列正在更新。另外,第一个,你确切知道需要添加哪些参数。

如果你正在写在几个地方此查询可能改变的事情

0

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

5

将文字直接放入方法并不可怕,只要您每次运行该查询时总是调用相同的方法即可。但是,如果要将该字符串文字复制到代码中的多个位置,则常量是绝对的首选。但是,不要在第二个示例中将字符串作为Query方法的参数,而应该使用枚举值。但是,如果您使用的是您描述的第二种方法,那么我会问您为什么不只是开始使用存储过程呢?

+1

存储特效的好点 –

+0

@Steven Doggart - 在我的情况下,有两个原因:有太多的管理权限给数据库(谁不应该有),以及将查询保持在源控制之下。 – user1481183

0

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

0

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

4

我会推荐使用存储过程作为比硬编码内联查询更好的解决方案。如果您必须稍后更改查询,则不必重新构建应用程序,因此可以修复查询中的错误,而无需部署整个应用程序。你在那里的第二个选项是等待发生的维护噩梦。当你有一个或两个查询时,它看起来非常好,但当你有几十或几百个查询时,它看起来会更难看。您的代码看起来像它的C#,所以我会建议您检查出微软企业库,

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

您可能需要根据您与开发的.NET Framework是什么版本下载不同版本。

0

如果你绝对必须有“内联” SQL,而不是存储过程(我已经这样做了实用型应用程序,仅仅与数据库交互,而不是自己吧),我建议把你的SQL变成了embedded resource file。这将使您的查询更容易维护(尽管您仍然需要重新编译应用程序以进行更改)。

0

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

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

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