gpt4 book ai didi

delphi - 在 Delphi 的 Unicode 版本中 Access 记录的真实缓冲区 - ADO

转载 作者:行者123 更新时间:2023-12-02 00:46:24 26 4
gpt4 key购买 nike

在升级到 Delphi 2010 之前,我们能够提取存储在 Access 数据库字符串字段中的数据,该字段实际上包含字节数组。

这是通过以下方式实现的:

  GetMem(buff, 66);
try
if Table.FieldByName('BytesInStrField').GetData(buff, True) then //True false ignored anyway
begin
Move(Buff^, X, 65);
end;
finally
//
end;

由于我们已经升级,甚至缓冲区似乎在第一个#0#0(字符串终止符)实例处停止读取

问题是我们无法再 Access 这些数据。我想提一下,并不是我自己决定将字节数组放入 Microsoft Access 字符串字段中。

有谁知道如何在不截断的情况下读取整个文件,我正在努力避免编写自己的整个数据库的直接二进制读取。

由于这是 Delphi Access Microsoft Access,所以我使用 TADO 组件。

感谢您的阅读。

最佳答案

TCustomADODataSet 的 GetFieldData 方法正是您所需要的。一共有三个:

function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: Pointer): Boolean; overload; override;

困难的工作在第二个中完成,这也是 TField.GetData 方法中使用的一个。

您将需要派生您自己的 TADODataSet 后代,并用您自己的版本覆盖 GetFieldData 方法的第二个版本。对所有其他字段调用继承,但对于特定的 BytesInString 字段,请自行读取缓冲区并避免在 TCustomADODataSet.GetFieldData 方法中完成的变体转换。

如果您想避免在任何地方插入自己的后代,请在 ADOInterceptor 单元中声明一个拦截器类:

TADODataSet = class(ADODB.TADODataSet)
public
function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; override;
;

并确保在使用 ADODB 的任何地方都使用该单元,并且它出现在 use 子句中的 ADODB 单元之后。

关于delphi - 在 Delphi 的 Unicode 版本中 Access 记录的真实缓冲区 - ADO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7637386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com