在升级到Delphi 2010之前,我们能够提取存储在访问数据库字符串字段中的数据,该字段实际上包含一个字节数组。
这是通过以下方式实现的:
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(字符串终结符)的第一个实例
问题是我们无法再访问此数据。我想提一下,不是我自己决定将一个Bytes数组放在Microsoft Access String Field中。
有没有人知道如何在不截断的情况下阅读整个文件,我正在努力避免编写自己的直接二进制读取整个数据库。
因为这是Delphi访问Microsoft Access我使用的是TADO组件。
感谢阅读。
答案 0 :(得分:3)
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的任何地方使用此单元,并且它在uses子句中的ADODB单元之后出现。
答案 1 :(得分:1)
您是否尝试过Table.FieldByName('BytesInStrField').AsBytes
答案 2 :(得分:1)
您是否尝试过Table.GetBlobFieldData()
?