1. Technology

Storing Record Data in a BLOB Field

By

Storing Record Data in a BLOB Field

In Delphi, a record data type is a special kind of user-defined data type. A record is a container for a mixture of related variables of diverse types, referred to as fields, collected into one type.

In database applications, data is stored in fields of various types: integer, string, bit (boolean), etc. While most data can be represented with simple data types, there are situations when you need to store images, rich documents or custom data types in a database. When this is the case you will use the BLOB (Binary Large Object) data type ("memo", "ntext", "image", etc. - the name of the data type depends on the database you work with).

Record as Blob

Here's how to store (and retrieve) a record (structure) value into a blob field in a database.

TUser = record ...
Suppose you have defined your custom record type as:

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

"Record.SaveAsBlob"
To insert a new row (database record) in a database table with a BLOB field named "data", use the following code:

 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; 
In the code above:
  • "myTable" is the name of the TDataSet component you are using (TTable, TQuery, ADOTable, TClientDataSet, etc).
  • The name of the blob field is "data".
  • The "User" variable (TUser record) is filled using 2 edit boxes ("edName" and "edNOQ")and a check box ("chkCanAsk")
  • The CreateBlobStream method creates a TStream object for writing to the blob field.

"Record.ReadFromBlob"
Once you have saved the record (TUser) data to a blob type field, here's how to "transform" binary data to a TUser value:

 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; 
Note: the code above should go inside the "OnAfterScroll" event handler of the myTable dataset.

That's it. Make sure you download the sample Record2Blob code.

©2014 About.com. All rights reserved.