How to Store Record Data in a BLOB Field in Delphi

window showing step to Store Record Data in a BLOB Field in Delphi

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.

    Format
    mla apa chicago
    Your Citation
    Gajic, Zarko. "How to Store Record Data in a BLOB Field in Delphi." ThoughtCo, Sep. 18, 2017, thoughtco.com/storing-record-data-in-blob-field-1057717. Gajic, Zarko. (2017, September 18). How to Store Record Data in a BLOB Field in Delphi. Retrieved from https://www.thoughtco.com/storing-record-data-in-blob-field-1057717 Gajic, Zarko. "How to Store Record Data in a BLOB Field in Delphi." ThoughtCo. https://www.thoughtco.com/storing-record-data-in-blob-field-1057717 (accessed May 25, 2018).