Hur man lagrar postdata i ett BLOB-fält i Delphi

I Delphi är en postdatatyp en speciell typ av användardefinierad datatyp. En post är en behållare för en blandning av relaterade variabler av olika typer, kallad fält, samlade i en typ.

I databasapplikationer lagras data i fält av olika typer: heltal, sträng, bit (boolean) osv. Medan de flesta data kan representeras med enkla datatyper finns det situationer när du behöver lagra bilder, rika dokument eller anpassade data skriver i en databas. När detta är fallet använder du datatypen BLOB (Binary Large Object) ("memo", "ntext", "image", etc. - namnet på datatypen beror på databasen du arbetar med).

Spela in som Blob

Så här gör du Lagra (och hämta) a spela in (struktur) värde till a klumpfält i en databas.

Användare = post ...
Anta att du har definierat din anpassade posttyp som:

 Användare = packad post
   Namn: sträng [50];
   CanAsk: boolean;
   NumberOfQuestions: heltal;
slutet;

"Record.SaveAsBlob"
För att infoga en ny rad (databaspost) i en databastabell med ett BLOB-fält med namnet "data", använd följande kod:

 var
   Användare: TUser;
   blobF: TBlobField;
   bs: TStream;
Börja
   User.Name: = edName.Text;
   User.NumberOfQuestions: = StrToInt (edNOQ.Text);
   User.CanAsk: = chkCanAsk.Checked;
   myTable.Insert;
   blobF: = myTable.FieldByName ('data') som TBlobField;
   bs: = myTable.CreateBlobStream (blobF, bmWrite);
   Prova
     bs.Write (User, SizeOf (User));
   till sist
     bs.Free;
   slutet;
slutet;

I koden ovan:

  • "myTable" är namnet på TDataSet-komponenten du använder (TTable, TQuery, ADOTable, TClientDataSet, etc).
  • Namnet på klumpfältet är "data".
  • Variabeln "Användare" (TUser-post) fylls med 2 redigeringsrutor ("edName" och "edNOQ") och en kryssruta ("chkCanAsk")
  • Metoden CreateBlobStream skapar ett TStream-objekt för att skriva till klumpfältet.

"Record.ReadFromBlob"
När du har sparat posten (TUser) -data i ett fält för blob-typ, så här "transformerar" binär data till ett TUser-värde:

 var
   Användare: TUser;
   blobF: TBlobField;
   bs: TStream;
Börja
   om myTable.FieldByName ('data'). IsBlob då
   Börja
     blobF: = DataSet.FieldByName ('data') som TBlobField;
     bs: = myTable.CreateBlobStream (blobF, bmRead);
     Prova
       bs.Read (användare, storlek av (TUser));
     till sist
       bs.Free;
     slutet;
   slutet;
   edName.Text: = User.Name;
   edNOQ.Text: = IntToStr (User.NumberOfQuestions);
   chkCanAsk.Checked: = User.CanAsk;
slutet;

Obs! Koden ovan bör gå in i händelsehanteraren "OnAfterScroll" i myTable-datasättet.

Det är allt. Se till att du laddar ner exemplet Record2Blob.