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 : string50; CanAsk : boolean; NumberOfQuestions : integer; end;
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.
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.