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

时间:2011-10-03 15:50:54

标签: delphi ms-access delphi-2010 ado

在升级到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组件。

感谢阅读。

3 个答案:

答案 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()