0

我在 Delphi XE2 中创建了一个 DLL,它使用 DB Express 和 TClientDataSet 来显示 DB Grid 中的连接结果。有一个简单的功能可以启动/显示导出以供其他应用程序使用的表单。在 FormActivate 上执行查询并填充网格。

当我调用该函数以从单独的 Delphi XE2 应用程序中显示表单时,一切运行正常 - 我找不到任何问题。

但是,当我从单独的 Delphi 7 应用程序调用相同的函数时,我收到一个错误,即 TClientDataSet 无法从连接中找到字段。

例如,数据返回如下:

[dbxds == TSQLDataSet
 cds == TClientDataSet]

dbxds.commandtext='select s.sfield1, s.sfield2, t.tfield1, t.tfield2 from s left join t on s.sfield1 = t.tfield1';

cds.Open;

cds.fieldByName(sfield2).visible:=false;//to hide from a dbgrid
cds.fieldByName(tfield2).visible:=false;//to hide from a dbgrid

从 XE2 调用时,没有问题。当从 Delphi 7 调用时,最后一行(用于从 db 网格中隐藏该字段)给出了一个错误:

cds: Field 'tfield2' not found 

虽然第一行很好 - 如果我切换查询的顺序以便首先检索“t”字段(“from t left join s”),那么我会在“s”字段上得到错误。

关于可能导致不兼容的任何想法?

谢谢!

4

1 回答 1

0

好吧,我注意到了一些奇怪的事情,这让我走上了寻找答案的道路。

碰巧的是,在任一表中,我试图访问以隐藏的字段都是“tinyint(1)”类型。如果我试图隐藏 int/varchar 等类型的字段,则不会引发错误。

我将我的 'tinyint(1)' 字段换成 'int(1)' 并且它工作正常。

不知道为什么会发生这种情况,但我很高兴我抓住了它,如果其他人遇到这个问题,我希望这也能回答他们的问题。

于 2012-09-17T14:32:17.897 回答