Hoe Record gegevens op te slaan in een BLOB-veld in Delphi

In Delphi is een recordgegevenstype een speciaal soort door de gebruiker gedefinieerd gegevenstype. Een record is een container voor een combinatie van gerelateerde variabelen van verschillende typen, velden genoemd, verzameld in één type.

In databasetoepassingen worden gegevens opgeslagen in velden van verschillende typen: integer, string, bit (boolean), enz. Hoewel de meeste gegevens kunnen worden weergegeven met eenvoudige gegevenstypen, zijn er situaties waarin u afbeeldingen, rijke documenten of aangepaste gegevens moet opslaan typen in een database. Als dit het geval is, gebruikt u het gegevenstype BLOB (Binary Large Object) ("memo", "ntext", "image", enz. - de naam van het gegevenstype is afhankelijk van de database waarmee u werkt).

Opnemen als Blob

Hier is hoe op te slaan (en terugvinden) een Vermelding (structuur) waarde in een blob veld in een database.

TUser = record…
Stel dat u uw aangepaste recordtype hebt gedefinieerd als:

 TUser = verpakt record
   Naam: string [50];
   CanAsk: boolean;
   NumberOfQuestions: integer;
einde;

"Record.SaveAsBlob"
Gebruik de volgende code om een ​​nieuwe rij (database-record) in een databasetabel in te voegen met een BLOB-veld met de naam "data":

 var
   Gebruiker: TUser;
   blobF: TBlobField;
   bs: TStream;
beginnen
   User.Name: = edName.Text;
   User.NumberOfQuestions: = StrToInt (edNOQ.Text);
   User.CanAsk: = chkCanAsk.Checked;
   myTable.Insert;
   blobF: = myTable.FieldByName ('data') als TBlobField;
   bs: = myTable.CreateBlobStream (blobF, bmWrite);
   proberen
     bs.Write (Gebruiker, SizeOf (Gebruiker));
   Tenslotte
     bs.Free;
   einde;
einde;

In de bovenstaande code:

  • "myTable" is de naam van de TDataSet-component die u gebruikt (TTable, TQuery, ADOTable, TClientDataSet, enz.).
  • De naam van het blob-veld is "data".
  • De variabele "Gebruiker" (TUser-record) wordt gevuld met behulp van 2 bewerkingsvakken ("edName" en "edNOQ") en een selectievakje ("chkCanAsk")
  • De methode CreateBlobStream maakt een TStream-object om naar het blob-veld te schrijven.

"Record.ReadFromBlob"
Nadat u de recordgegevens (TUser) hebt opgeslagen in een blob-type veld, gaat u als volgt te werk om binaire gegevens te "transformeren" naar een TUser-waarde:

 var
   Gebruiker: TUser;
   blobF: TBlobField;
   bs: TStream;
beginnen
   if myTable.FieldByName ('data'). IsBlob dan
   beginnen
     blobF: = DataSet.FieldByName ('data') als TBlobField;
     bs: = myTable.CreateBlobStream (blobF, bmRead);
     proberen
       bs.Read (gebruiker, sizeof (TUser));
     Tenslotte
       bs.Free;
     einde;
   einde;
   edName.Text: = User.Name;
   edNOQ.Text: = IntToStr (User.NumberOfQuestions);
   chkCanAsk.Checked: = User.CanAsk;
einde;

Opmerking: de bovenstaande code moet in de gebeurtenishandler "OnAfterScroll" van de myTable-gegevensset gaan.

Dat is het. Zorg ervoor dat u de voorbeeld Record2Blob-code downloadt.