3

我正在使用 Anydac 组件来访问数据库。TADOQuery 用于从 SQL 数据库中选择数据。

其中一个字段是文本,但我需要显示一些 RTF 而不是此文本(相同的文本但带有突出显示的单词等)。我尝试在 TADQuery 的 OnCalcFields 事件中创建 BLOB 类型的计算字段并用正确的值(来自 DB 的原始文本 + 一些处理)填充它。但它不起作用。我在应用程序启动时获得 AV:

“字段‘xxx’不能是计算字段或查找字段。”。

如果我将 FieldKind 属性更改为 fkI​​nternalCalc(默认值为 fkCalculated),则应用程序将启动,但是当尝试设置值时,我会在 OnCalcFields 处获得 AV:

“数据集未处于编辑或插入模式。”

如果我定义了计算字符串字段(而不是 BLOB 字段),那么一切正常,但字符串类型还有另一个问题。对于字符串类型,我必须提供 Size 属性来限制文本的最大大小。如果我使用高于 64k 的值,例如 67000,当尝试在 OnCalcFields 事件处理程序中分配值(甚至是短值!)时,我会得到 AV:

项目 xxx.exe 引发异常类 $C0000005,并带有消息“0x004094fc 处的访问冲突:读取地址 0xfffffffc”。

因此,我既不能创建计算的 BLOB 字段,也不能创建计算的字符串字段。(它的最大尺寸是有限的,并且没有信息什么最大尺寸是真正安全的。我发现尺寸> 64k的问题,但不确定它在使用较小的块时是否稳定。)

任何想法我做错了什么?

更新:目前我以不同的方式实现了它。我替换了表示层上的数据,但这只是一种解决方法,问题仍然存在。是否可以在 Delphi 中使用 BLOB 类型的计算字段(最好使用 Anydac TADQuery)?是否有任何关于字符串类型计算字段限制的信息(或者也许有人有经验如何避免它们)?

procedure TDBDM.CommentsCalcFields(DataSet: TDataSet);
begin
  CommentsHighlighted.AsString := 'test';
end;

所以,TADQuery 有一些 SQL 查询,一些定义的字段 + 1 个 BLOB 类型的计算字段 + OnCalcFields 事件处理程序(代码在上面)。当我启动应用程序(并尝试打开查询)时,它会生成 AV。我尝试过的其他事情前面已经描述过了。

4

0 回答 0