Доступ к истинному буферу записи в Unicode-версии Delphi - ADO - PullRequest
2 голосов
/ 03 октября 2011

До обновления до 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 (терминатор строки)

Проблема в том, что эти данные нам больше не доступны.Я хотел бы упомянуть, что это не я сам решил поместить массив байтов в поле строки Microsoft Access.

Кто-нибудь знает, как я могу прочитать весь файл без усечения, я стараюсь изо всех силизбегайте написания моего прямого двоичного чтения всей базы данных.

Поскольку это Delphi Доступ к Microsoft Access, я использую компоненты TADO.

Спасибо за чтение.

Ответы [ 3 ]

3 голосов
/ 03 октября 2011

Методы GetFieldData класса TCustomADODataSet - это то, что вам нужно.Их три:

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, и появляется ПОСЛЕ модуля ADODB в предложении использования.

1 голос
/ 03 октября 2011

Вы пробовали Table.GetBlobFieldData()?

1 голос
/ 03 октября 2011

Вы пробовали Table.FieldByName('BytesInStrField').AsBytes

...