首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索TQuery结果的元数据

检索TQuery结果的元数据
EN

Stack Overflow用户
提问于 2011-03-14 17:07:13
回答 3查看 443关注 0票数 0

在我们的应用程序中,用户可以输入SQL代码从NexusDB数据库检索数据。我们希望在不实际执行查询的情况下确定此类查询结果的元数据。我们使用元数据来确定字段的数量和每个结果字段的数据类型。

添加我们将此功能用作用户定义的转换过程的一部分。实际的转换是稍后在类似批处理的过程中完成的,但我们需要预先获得元数据,因此用户可以在转换中指定额外的字段特征或修改,如应用插件、创建父子关系等。/addition

到目前为止,我们基本上是通过在SQL查询中添加WHERE FALSE或者用WHERE FALSE AND替换所有已经存在的WHERE语句来做到这一点的。当然,我们必须解析整个SQL以确定要调整的正确where子句的确切位置,并考虑注释、嵌套SELECTS、JOIN和其他子句。这样会变得相当复杂:-(

这样做的另一个缺点是,即使我们事先知道结果集将为空,大多数情况下查询的执行仍然可能需要很长时间。

我们想知道是否有其他方法来实现这一点。

也就是说,TQuery对象必须有自己的解析器,将SQL语句拆分到不同的子句中。如果我们可以在执行前更改where子句,我们就不必自己进行解析了。但是我们有点急于深入研究TQuery对象的内部,只是为了发现没有办法以我们想要的方式使用它。

有人对此有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-14 19:43:08

深入研究客户端TnxQuery组件也无济于事。它只是语句和游标句柄的包装器。在客户端检索元数据的唯一方法是从游标句柄检索。只有在执行查询时才会生成游标句柄。

现在,要最小化执行查询时所执行的工作,唯一的方法就是您已经在做的事情。

如果你在我们的问题跟踪器( http://www.nexusdb.com/mantis/view_all_bug_page.php )中提交了一个功能请求,我们可以研究指定一些标志的可能性,告诉引擎“永远不处理任何数据”,而不需要打乱查询本身。

票数 1
EN

Stack Overflow用户

发布于 2011-03-14 18:55:04

您已经执行的操作的一种变体是将原始SQL语句放入嵌套的select语句中,而不是修改where子句。如果select * from MyTable是您复杂的查询,您可以像这样嵌入它,这样就得不到任何结果。

代码语言:javascript
复制
select *
from
(
  select *
  from MyTable
) as xx
where 0=1

我只在SQL Server中进行了测试,而没有在NexusDB中进行测试

票数 3
EN

Stack Overflow用户

发布于 2011-03-15 00:36:32

您还可以尝试将带有TDatasetProvider的TClientDataset链接到原始TQuery (或任何TDataset子体)。然后将TClientDataset的PacketRecords属性设置为0,并打开它。它将检索TClientDataSet中的字段,但不包含任何数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5296588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档