Хранение данных Record в BLOB полях
В приложениях с базами данных, данные хранятся в полях различных типов: 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;
Комментарии