Come archiviare i dati dei record in un campo BLOB in Delphi

In Delphi, un tipo di dati record è un tipo speciale di tipo di dati definito dall'utente. Un record è un contenitore per una miscela di variabili correlate di diversi tipi, denominati campi, raccolti in un tipo.

Nelle applicazioni di database, i dati sono archiviati in campi di vari tipi: intero, stringa, bit (booleano), ecc. Mentre la maggior parte dei dati può essere rappresentata con tipi di dati semplici, ci sono situazioni in cui è necessario archiviare immagini, documenti complessi o dati personalizzati digita in un database. In questo caso utilizzerai il tipo di dati BLOB (Binary Large Object) ("memo", "ntext", "image", ecc. - il nome del tipo di dati dipende dal database con cui lavori).

Registra come BLOB

Ecco come memorizzare (e recuperare) a disco (struttura) valore in a campo blob in un database.

TUser = record ...
Supponiamo di aver definito il tipo di record personalizzato come:

 TUser = record impaccato
   Nome: stringa [50];
   CanAsk: booleano;
   NumberOfQuestions: intero;
fine;

"Record.SaveAsBlob"
Per inserire una nuova riga (record del database) in una tabella del database con un campo BLOB denominato "dati", utilizzare il codice seguente:

 var
   Utente: TUser;
   blobF: TBlobField;
   bs: TStream;
inizio
   User.Name: = edName.Text;
   User.NumberOfQuestions: = StrToInt (edNOQ.Text);
   User.CanAsk: = chkCanAsk.Checked;
   myTable.Insert;
   blobF: = myTable.FieldByName ('data') come TBlobField;
   bs: = myTable.CreateBlobStream (blobF, bmWrite);
   provare
     bs.Write (Utente, SizeOf (Utente));
   infine
     bs.Free;
   fine;
fine;

Nel codice sopra:

  • "myTable" è il nome del componente TDataSet che si sta utilizzando (TTable, TQuery, ADOTable, TClientDataSet, ecc.).
  • Il nome del campo BLOB è "dati".
  • La variabile "Utente" (record TUser) viene riempita utilizzando 2 caselle di modifica ("edName" e "edNOQ") e una casella di controllo ("chkCanAsk")
  • Il metodo CreateBlobStream crea un oggetto TStream per la scrittura nel campo BLOB.

"Record.ReadFromBlob"
Dopo aver salvato i dati del record (TUser) in un campo di tipo BLOB, ecco come "trasformare" i dati binari in un valore TUser:

 var
   Utente: TUser;
   blobF: TBlobField;
   bs: TStream;
inizio
   se myTable.FieldByName ('data'). IsBlob quindi
   inizio
     blobF: = DataSet.FieldByName ('data') come TBlobField;
     bs: = myTable.CreateBlobStream (blobF, bmRead);
     provare
       bs.Lead (utente, sizeof (TUser));
     infine
       bs.Free;
     fine;
   fine;
   edName.Text: = User.Name;
   edNOQ.Text: = IntToStr (User.NumberOfQuestions);
   chkCanAsk.Checked: = User.CanAsk;
fine;

Nota: il codice sopra riportato dovrebbe rientrare nel gestore eventi "OnAfterScroll" del set di dati myTable.

Questo è tutto. Assicurati di scaricare il codice di esempio Record2Blob.