Хранение данных 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;
Комментарии