【问题标题】:Creating a general SQL Query builder创建通用 SQL 查询构建器
【发布时间】:2010-10-27 10:01:06
【问题描述】:

在 delphi 中创建查询构建器的最佳方法是什么?

我有 devexpress 量子网格,所以我可以轻松地显示数据。

【问题讨论】:

    标签: sql delphi


    【解决方案1】:

    我假设您需要一个查询生成器来为数据库编写 SQL 语句,而不是 Quantum Grid 上的过滤器(它自己有一个出色的过滤系统。)

    我们已经使用 SQLGenerator 对象好几年了。我们从另一个项目继承了这个对象。虽然它做了它应该做的事情,但如果我要创建一个新语句,我总是需要查找一个例子,对我来说,事情应该被简化(至少简化到我的理解水平) em>。

    几个想法已经通过了评论。

    每个 SQL 关键字本身就是一个对象

    Node := where.AddNode;
    Node.Condition := cndOR
    Node.Add(a);
    Node.Add(b)
    

    打开数组添加条件

    And([a, Or([b])]);
    

    但今天我可能会将其实现为

    SQLBuilder
      .where
        .condition(a)
      .and
        .condition(b)
    

    SQLBuilder 对象可能如下所示

      ISQLBuilder = interface
        function select: ISQLBuilder;
        function from: ISQLBuilder;
        function innerJoin: ISQLBuilder;
        function where: ISQLBuilder;
    

    应该可以写

      sqlStatement := SQLBuilder
        .select
          .column('o.name')
          .column('oi.price')
        .from
          .table('orders o')
          .innerjoin('orderitems oi').on('o.orderid').equals('oi.orderid')
        .where
          .condition('oi.price < 100')
          .and.condition('o.name').equals('LatestOrder')
        .Build;
    

    除了用纯文本写声明之外,我还在努力弄清楚这一切给我带来了什么。

    【讨论】:

    • 您好!是的,确实 Quantum 网格有一个强大的过滤系统:) 你在哪里找到了 SQLbuilder 对象?
    • 我还不存在(据我所知)。这是我们希望自己实现的东西......总有一天
    • 这需要一种将数据也绑定到某种对象/对象集的方法。如果 .column 方法还接受绑定数据的位置参数,那么这将比简单的代码生成器有用得多。
    • 好主意,但仔细想想:LINQ 不是开箱即用的(绑定、生成……)
    • 啊,我明白了,您建议创建一些 TSQLBuilder 类对象.. 真是个好主意:)。我可能会想到这样的事情。最困难的部分可能是将它们全部放在一个 Tstringlist 中,或者如果你想修改它,或者将它反转回这种格式:)
    【解决方案2】:

    我使用 Active Query Builder (http://www.activequerybuilder.com/product_vcl.html) 作为用户构建查询的 UI。如果您购买源代码,它包括一个与 Dev Express 网格的外观相匹配的选项。

    【讨论】:

      【解决方案3】:

      至少在几年前,Delphi 最好的查询构建组件是“简单查询”,这是来自俄罗斯工具制造商的廉价组件。伟大的组件,功能比它们最初出现的更深入和更好的考虑。我成功地使用它与 QuantumGrid 中的数据集成。 (由于 Simple Query 仅生成一个 SQL 字符串,因此并没有太多可以集成的方式。但我也定制了视觉外观,使其看起来与 QG 一致。)http://devtools.korzh.com/query-builder-delphi/

      请注意,Simple Query(及其“Easy Query”.NET 组件)的界面旨在使用户能够轻松生成有效搜索,而无需任何表、联接或 SQL 的概念。开发人员需要一些远见才能以这种方式完美地配置界面,但这是一个不错的功能。也可用作数据库专家的“全能”解决方案。

      另外,我假设您知道 QG 有自己的集成视觉查询系统。我认为我的主要问题是它主要用于过滤现有数据集,但无论如何简单查询要灵活得多。

      另一件事,在 Simple Query 的内部,有许多用于生成最终 SQL 字符串的对象,类似于您发布和询问的代码。这样做的主要目的是作为 SQL 的视觉描述和最终输出之间的中间阶段。

      【讨论】:

        【解决方案4】:

        这实际上取决于您希望查询构建器有多复杂和直观。我在 Delphi 5 中的应用程序中编写了一个廉价而愉快的 SQL 查询表单,使用仅允许运行 Select 命令的 TMemo 组件。您可以运行各种 sql 查询来从架构上的 SQL 收集信息,以便您可以获取数据库中的表和字段并填充树视图组件或类似的东西。

        【讨论】:

          【解决方案5】:

          既然已经准备好将解决方案编译到您的应用程序中,为什么还要编写您自己的解决方案?快速报告的人有一个很好的query builder,其中包括完整的源代码。还有一个 open source version,尽管您必须自己更新它以支持 Unicode。

          【讨论】:

          • 这个时候,我的预算很少,如果能自己写点什么,暂时最好
          【解决方案6】:

          最重要的是了解构造函数对最终用户的价值。通常是数据。您可以为用户建造一堵墙,他自己会尽可能地超越它,或者提供一个方便的楼梯和电梯。高级用户可能需要使用子查询。不太高级的用户将处理内置在 QuantiumGrid 中的过滤器构建器。为 Delphi 使用现成的解决方案可能是合理的:Active Query Builder、FastQueryBuilder、Advanced Query Builder。

          如果您要创建自己的设计,则需要确定三个组件:UI、引擎和元数据。列出每个组件的要求:使用哪些服务器、如何使用参数、如何防止 SQL 注入等。

          用户界面 要为 Delphi 创建查询构建器,需要了解 UI 功能。如果用户界面很简单,它将在功能方面受到限制。在 EasyQuery 中使用了这种方法(仅当您拥有 QuantiumGrid 时;然后您可以直接在 QG 中使用所有 EQ 功能)。而且,如果扩展功能,UI的复杂度会几何级地增加。

          引擎 编写或选择将构建随机表的引擎似乎并不困难。它在纸上很光滑。在实践中,需要解决许多复杂的任务,例如组织“如何在 FROM 表达式中正确制作对象,牢记用户创建的所有连接发明,最重要的是,对应于用户期望收到什么。?”用户不必考虑如何提出请求,而应严格遵循其指示。此外,一个人不应该只是提出要求,而应该是正确的。正确编写引擎的任务是控制并温和地纠正用户

          元数据 如果构造函数不仅可以帮助构建查询,而且可以建议用户快速构建查询所需的数据在哪里,那就太好了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-07
            相关资源
            最近更新 更多