【发布时间】:2011-03-14 09:07:12
【问题描述】:
在我们的应用程序中,用户可以输入 SQL 代码来从 NexusDB 数据库中检索数据。 我们希望在不实际执行查询的情况下确定此类查询结果的元数据。我们使用元数据来确定字段的数量和每个结果字段的数据类型。
[加法] 我们将此功能用作用户定义的转换过程的一部分。实际的转换稍后在类似批处理的过程中完成,但我们需要事先元数据,因此用户可以在转换中指定其他字段特征或修改,如应用插件、创建父子关系等。 [/加法]
到目前为止,我们基本上通过在 SQL 查询中添加 WHERE FALSE 或将所有已经存在的 WHERE 语句替换为 WHERE FALSE AND 来做到这一点。但是当然我们必须解析整个 SQL 以确定要调整的正确 where 子句的确切位置,同时考虑到 cmets、嵌套 SELECTS、JOIN 和其他子句。这种方式变得相当复杂:-(
这样做的另一个缺点是,即使我们事先知道结果集将为空,但大多数时候查询的执行仍然需要很长时间。
我们想知道是否有其他方法可以实现这一目标。
即TQuery 对象必须有自己的解析器,将 SQL 语句拆分为不同的子句。如果我们可以在执行之前更改 where 子句,我们就不必自己进行解析。但是我们有点急于深入 TQuery 对象的内部,只是为了发现没有办法以我们想要的方式使用它。
有人对此有什么建议吗?
【问题讨论】:
-
您正在尝试做一些非常不典型的事情:获取返回字段的列表而不获取实际字段。唯一可能有帮助的是
Prepare方法,但在我的测试中它没有设置Fields。您使用 BDE 并在访问数据库之前至少经过两次间接访问这一事实无济于事。我会尝试简单地解决该问题,但不尝试事先获取字段列表。解析 SQL 可能是一项艰巨的任务,尤其是在面对涉及联合和联接的复杂查询时; -
关于深入研究
TQuery:别打扰,答案不存在。只有数据库知道答案,TQuery 只是一个中介。想想这个查询:SELECT * FROM MYTABLE。很明显,TQuery 无法知道MYTABLE中的内容,只有数据库知道! -
@Cosmin 查看原始问题中的补充内容,顺便说一下,我们没有使用 BDE。
标签: sql delphi delphi-2007 nexusdb