我正在使用一个使用大量内联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;
}
}
谢谢!
答案 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是我能想到的唯一一种计算机语言,我们接受在字符串文字中查看。这应该是一个丑闻。