我爱Aspx >> Asp.Net >> 在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()!
Ҷƪл˵?
病毒及流氓软件自我复制的简单实..[03-16]
用C#和WMI获取逻辑驱动器详细信息[03-16]
用Visual C#开发简单的复合控件[03-16]
Visual C# 2.0匿名方法揭密[03-16]
深入理解C# 3.0的五项主要改进[03-16]
病毒及流氓软件自我复制的简单实..[03-16]
在C#中建立复杂的、灵活的SQL查询..[03-16]
用C#和WMI获取逻辑驱动器详细信息[03-16]
Visual C# 2.0匿名方法揭密[03-16]
用Visual C#开发简单的复合控件[03-16]
VS2005+Crystal Report开发Web应..[03-17]
ASP.NET 2.0服务器控件之客户端功..[03-17]
ASP.NET+Atlas创建客户端Web应用..[03-17]
基于ASP.NET技术的驾校网页设计[03-17]
ASP.NET+Atlas创建客户端Web应用..[03-17]
ASP.NET 2.0服务器控件之客户端功..[03-17]
基于ASP.NET技术的驾校网页设计[03-17]
ASP.NET 2.0服务器控件开发之简单..[03-17]
为.NET程序批上WPF的绚丽外衣[03-17]
ASP.NET编程入门随想之宽容[03-17]