科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在C#中建立复杂的、灵活的SQL查询/命令

在C#中建立复杂的、灵活的SQL查询/命令

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

SelectQueryBuilder类允许在你的代码中建立复杂的SQL语句和命令。它也能帮助于避免SQL注入式攻击。

作者:佚名 来源:博客园 2007年11月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
建立计算查询

  如果你想对你的数据库执行一个计算查询。你能使用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’的订单(请不要问为什么有人想查询某个人的订单,这仅仅是一个 例子)。这个查询能够建立:

SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
// Add 'Criteria' column to level 1
query.AddWhere("CustomerID", Comparison.Equals,"VINET", 1);
query.AddWhere("OrderDate", Comparison.LessThan,new DateTime(2005,1,1), 1);
// Add first 'Or...' column to level 2
query.AddWhere("CustomerID", Comparison.Equals, "TOMSP", 2);
query.AddWhere("OrderDate", Comparison.LessThan,new DateTime(2004,6,30), 2);
// Add second 'Or...' column to level 3
query.AddWhere("CustomerID", Comparison.Equals,"TOMSP", 3);
query.AddWhere("OrderDate", Comparison.GreaterThan,new DateTime(2006,1,1), 3);

  当调用 BuildQuery时,所有定义的层将被OR到一起,几乎和SQL Server生成的一样。

  如果你到所产生的语句接近一样时,想让查询更复杂,你可能会说“我的放两个随后的语句一起放在一个语句中,在两个日期间使用OR”。你能够这样作。在SQL Server查询生成器中,这个查询看起来像:

  同样,它也可能使用SelectQueryBuilder通过创建’嵌套的WHERE子句’来实现。

SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
// Add 'Criteria' column to level 1
query.AddWhere("CustomerID", Comparison.Equals, "VINET", 1);
query.AddWhere("OrderDate", Comparison.LessThan,
new DateTime(2005,1,1), 1);
// Add 'Or...' column to level 2
query.AddWhere("CustomerID",
Comparison.Equals, "TOMSP", 2);
// Add the date selection clause
WhereClause clause =query.AddWhere("OrderDate", Comparison.LessThan,
  new DateTime(2004,6,30), 2);
// Add a nested clause to the captured clause
clause.AddClause(LogicOperator.Or,
Comparison.GreaterThan, new DateTime(2006,1,1));

  注意到我用了一个WhereClause对象,它由AddWhere调用返回。接着调用clause.AddClause创建一个嵌套的子句柄,并且选择通过指定LogicOperator.Or来把它OR到第一个子句上。所产生的语句如下:

SELECT Orders.*
FROM Orders
WHERE
(
 (CustomerID = 'VINET')
 AND (OrderDate < '2005/01/01 12:00:00')
)
OR
(
 (CustomerID = 'TOMSP')
 AND (OrderDate < '2004/06/30 12:00:00' OR
 OrderDate > '2006/01/01 12:00:00')
)

  请注意这个例子中日期包含’12:00:00’,这是因为我在DateTime构造体中忽略了时间。但这只要由于我的习惯。如果我使用new DateTime(2006,1,1,0,0,0),日期字符串将包含’00:00:00’。

  结论

  在介绍中我就提到,SelectQueryBuilder是CodeEngine框架的一部分。这个框架 也包含了DeleteQueryBuilder,UpdateQueryBuilder,InsertQueryBuilder。我在通过我的C#DAL产生器生成的代码中使用这些生成器。你能从www.code-engine.com上下载一份 框架DLL的拷贝。在这期间我也将发布其它的查询生成器的源代码。同时如果你有什么问题,评价或建议,请及时与我联系。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章