• λ我爱Aspx >> C#.Net >> 在C#中建立复杂的、灵活的SQL查询/命令
  • 在C#中建立复杂的、灵活的SQL查询/命令

  • :  Դ:博客园  :2007-3-16 21:00:26  ؼ:c#,sql
  • 我相信上面的代码对你来说是非常熟悉的,你可能在过去的十多年一直是这样使用的,或者你曾经编码过数据库驱动的搜索功能。让我告诉你这种思想:这种查询你的数据库的方法不能再使用了,它是难看的也是不安全的。

    SelectQueryBuilder方式的代码

    同样的查询能够使用SelectQueryBuilder类建立。

    SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Customers");query.SelectAllColumns();query.TopRecords = maxRecords;if (companyNameTextBox.Text.Length > 0) query.AddWhere("CompanyName", Comparison.Like,companyNameTextBox.Text + "%"); if (cityTextBox.Text.Length > 0) query.AddWhere("City", Comparison.Like, cityTextBox.Text + "%"); if (countryComboBox.SelectedItem != null) query.AddWhere("Country", Comparison.Equals, countryComboBox.SelectedItem); string statement = query.BuildQuery(); // or, have a DbCommand object built // for even more safety against SQL Injection attacks: query.SetDbProviderFactory( DbProviderFactories.GetFactory( "System.Data.SqlClient")); DbCommand command = query.BuildCommand();

    你能看到,这种方式比直接使用连接字符串更直观。考虑到第一个例子SQL注入的危险,通过SelectQueryBuilder建立的SELECT查询是非常安全的,并不用担心使用的TextBoxs中的内容。事实上它也非常简单!

    使用SQL函数

    如果你想在你的查询中使用SQL函数,你能使用SqlLiteral类来打包函数的调用。说明这个类能作什么的最好方式就是给你显示一小段代码例子:

    SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Orders");query.AddWhere("OrderDate", Comparison.LessOrEquals,new SqlLiteral("getDate()"));

    如果我们没有打包getDate()函数调用到SqlLiteral类中,建立的查询就会产生WHERE子句:OrderDate<=’getDate()’。当然,我们希望在语句中的这个函数没有被单引号包围。这时SqlLiteral就可以派上用场了:它直接拷贝字符串到输出,并没有把它格式化成字符串。现在的输出WHERE子句应当是OrderDate<=getDate()!

    Ҷƪл˵?
  • һƪASP.NET 2.0中保证应用程序的安全
    һƪ用C#和WMI获取逻辑驱动器详细信息