Внешний вид сайта:

Хранение данных Record в BLOB полях

В Delphi тип данных Record — специальный вид типа данных, определяемых пользователем. Record — контейнер для смеси связанных переменных разнообразных типов, называемых полями, и собранные в один тип.

В приложениях с базами данных, данные хранятся в полях различных типов: integer, string, bit (boolean) и т.д. В то время, как большинство данных может быть представлено простыми типами данных, но есть ситуации, когда Вам нужно хранить изображения, Rich-документы или пользовательские типы данных. Когда дело обстоит так, нужно использовать BLOB (Binary Large Object) для хранения типа данных типа Memo, Image и т.д. - имя типа данных зависит от базы данных, с которой Вы работаете.

Record как BLOB

Здесь показывается, как хранитьнаходить) значение record в поле BLOB базы данных.

TUser = record ...

// Предположим, что Вы определили Ваш тип record как:

TUser = packed record
   Name : string[50];
   CanAsk : boolean;
   NumberOfQuestions : integer;
end;

Record.SaveAsBlob

Чтобы вставить новую строку (запись базы данных) в таблицу базы данных с полем BLOB по имени Data, используйте следующий код:

var
   User : TUser;
   blobF : TBlobField;
   bs : TStream;
begin
   User.Name := edName.Text;
   User.NumberOfQuestions := StrToInt(edNOQ.Text) ;
   User.CanAsk := chkCanAsk.Checked;

   myTable.Insert;

   blobF := myTable.FieldByName('data') as TBlobField;
   bs := myTable.CreateBlobStream(blobF, bmWrite) ;
   try
     bs.Write(User,SizeOf(User)) ;
   finally
     bs.Free;
   end;
end;

В коде выше:

  • myTable - имя компонента TDataSet, который Вы используете (TTable, TQuery, ADOTable, TClientDataSet и т.д.)
  • Имя BLOB поля - data
  • Переменная User (запись TUser) заполняется, используя 2 поля ввода (edName и edNOQ) и переключатель chkCanAsk
  • Метод CreateBlobStream создает объект TStream для записи поля BLOB.

Record.ReadFromBlob

Как только Вы сохранили данные записи TUser в поле типа BLOB, можно преобразовать двоичные данные в значение TUser:

var
   User : TUser;
   blobF : TBlobField;
   bs : TStream;
begin
   if myTable.FieldByName('data').IsBlob then
   begin
     blobF := DataSet.FieldByName('data') as TBlobField;
     bs := myTable.CreateBlobStream(blobF, bmRead) ;
     try
       bs.Read(user,sizeof(TUser)) ;
     finally
       bs.Free;
     end;
   end;

   edName.Text := User.Name;
   edNOQ.Text := IntToStr(User.NumberOfQuestions) ;
   chkCanAsk.Checked := User.CanAsk;
end;

Примечание: код выше должен быть внутри обработчика события OnAfterScroll набора данных myTable.

Чтобы определить размер BLOB-поля, используйте эту функцию:

Function GetBlobSize(Field: TBlobField): LongInt;

begin
  with TBlobStream.Create(Field, bmRead) do 
    try
      Result := Seek(0, 2); 
    finally
      Free; 
    end;
end;

Комментарии

Нет комментариев. Ваш будет первым!