在C#中建立复杂的、灵活的SQL查询/命令(2)_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:ASP.NET生成高质量缩略图通用函数(c#代码)
在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.

  你能看到,这种方式比直接使用连接字符串更直观。考虑到第一个例子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()!

  查询中使用JOINs

  要创建到其它表的JOINs,你能使用AddJoin方法。下面的代码显示了如何创建一个从Ordres表到Customers表的INNER JOIN。


SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
query.AddJoin(JoinType.InnerJoin,"Customers", "CustomerID",Comparison.Equals,"Orders", "CustomerID");
query.AddWhere("Customers.City",Comparison.Equals, "London");

  这段代码选择所有居住在London的客户的订单。一旦调用了BuildQuery方法,就会产生下面的SQL语句:


SELECT Orders.*
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE (Customers.City = 'London')

  注意到缺省的查询只会建立所选择的表的selects * 语句(这个例子中的Orders.*)。如果你也想选择连接表的列的话,你必须得显式地选择它们。你能通用调用query.SelectColumns(“Orders.*”,”Customers.*”)。

  建立计算查询

  如果你想对你的数据库执行一个计算查询。你能使用SelectCount方法如同下面显示的:

  Query.SelectCount();

  在更加复杂的计算查询中,你可能想使用GROUP BY语句。看一下下面的例子,它显示了如何使用GroupBy和AddHaving方法。

SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectColumns("count(*) AS Count", "ShipCity");
query.SelectFromTable("Orders");
query.GroupBy("ShipCity");
query.AddHaving("ShipCity", Comparison.NotEquals, "Amsterdam");
query.AddOrderBy("count(*)", Sorting.Descending);

  上面的代码选择了每个城市的订单数,并用订单数目排序,不考虑来自制Amsterdam的订单,BuildQuery方法的输出结果应当是:


SELECT count(*) AS Count, ShipCity
FROM Orders
GROUP BY ShipCity
HAVING (ShipCity <> 'Amsterdam')
ORDER BY count(*) DESC

  复杂的Where语句

  如果你曾经用过微软的Access或SQL Server的内置的查询生成器的话,是否惊讶你能建立和代码一样的包含多层ANDs和Ors,并没有关心()符号的位置的查询?是的?我也能!

  你能使用SelectQueryBuilder类实现!你能加多层的WHERE语句到你的查询。缺省,所有对query.AddWhere的调用被放在查询的第一层上。你可以把它比作SQL Server查询生成器的’Criteria’列;第二、三、四层等相应地对应于’Or…’列。

  看一下下面的SQL Server查询生成器的快照,通过它我能快速地把简单的假的SELECT语句放在一起来:

  如你看到的,我创建一个查询,它选择所有在1-1-2005日期之前的客户’VINET’的订单,和所有30-6-2004日期之前或1-1-2006日期之后的客户’TOMSP’的订单(请不要问为什么有人想查询某个人的订单,这仅仅是一个 例子)。这个查询能够建立:

分享:asp.net里面的身份验证和授权
今天闲着无聊.想起来了ASP.NET身份验证.感觉良好.贴出下列代码: login.aspx HTML代码 <%@ Page language="c#" Codebehind="02Login.aspx.cs" AutoEventWire

来源:模板无忧//所属分类:.Net教程/更新时间:2008-08-22
相关.Net教程