Newsgroup: it.comp.lang.delphi
Titolo: DB e immangini

Ho la necessità di creare un archivio che mi cataloghi delle scansioni,
e quindi tanti files .jpg, dove la cosa si complica per via dei nomi dei
file.
La domanda è posso aggiungere i files in un database ?
Il DB è interbase
Avreste esempi per aiutarmi ?
Un grazie anticipato.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 La domanda è posso aggiungere i files in un database ?
Si, ma la cosa piu' semplice e' salvare i file con il numero dell'ID e
mantenere nel database solo il riferimento.
-- 
I'am what I'am, I do what I can

 mantenere nel database solo il riferimento.
sempre che le immagini non siano centinaia o migliaia; in quel caso gestirle
come file singoli in una cartella "immagini" sarebbe sconsigliabile e la
soluzione del database diventerebbe la piu' efficace, non solo sotto
l'aspetto della frammentazione/velocita' di caricamento, ma anche dal punto
di vista del backup dei dati.
Per tornare alla domanda di PDB: il metodo generale e' crare un campo blob
nella tabella e usare il metodo loadfromfile per caricarci dentro il
contenuto (l'immagine, nel tuo caso). Per l'implementazione specifica su
interbase passo la parola ad altri, non uso quel database ne' mi e' mai
capitato di inizializzare un blob da sql.
Ciao, Sandro

semplice si, veloce no.
se il numero di immagini è bello grande, la app si siede.
Meglio metterli nel db
A

 Il DB è interbase
Immagino che se hai i file su disco la cosa piu' semplice sia usare
LoadFromFile.
Io ho sottomano (v. sotto) un esempio dove il caricamento su DB (di un
blob generico) e' effettuato a partire da un MemoryStream (tramite
INSERT parametrica) e l'estrazione ancora su uno stream. I componenti
usati sono gli IBX.
*Comunque* prova con un po' di approcci diversi prima di scegliere una
soluzione definitiva.
Saluti
Paolo Arosio
Inserimento:
NB: i parametri non sono tipizzati nell'Object Inspector
    INSERT INTO SPECTRUMS (
      SP_ID,
      SP_BASEFREQUENCY,
      SP_ACC_X, SP_ACC_Y, SP_ACC_Z,
      SP_SEA
    )
    VALUES (
      :SpId,
      :SpBaseFrequency,
      :SpAccelX, :SpAccelY, :SpAccelZ,
      :SpSea
    );
...
  if not qrySpectrumAdder.Prepared then
    qrySpectrumAdder.Prepare;
...  // qsa == qrySpectrumAdder; src == Source
qsa.ParamByName('SpId').AsInteger := Source.SpectrumID;
qsa.ParamByName('SpBaseFrequency').AsFloat := Source.BaseFrequency;
src.Spectrums[skAccX].Seek(0, soFromBeginning);
src.Spectrums[skAccY].Seek(0, soFromBeginning);
src.Spectrums[skAccZ].Seek(0, soFromBeginning);
src.Spectrums[skSea].Seek(0, soFromBeginning);
qsa.ParamByName('SpAccelX').LoadFromStream(src.Spectrums[skAccX],ftBlob)
;
qsa.ParamByName('SpAccelY').LoadFromStream(src.Spectrums[skAccY],ftBlob)
;
qsa.ParamByName('SpAccelZ').LoadFromStream(src.Spectrums[skAccZ],ftBlob)
;
qsa.ParamByName('SpSea').LoadFromStream(src.Spectrums[skSea],ftBlob);
qsa.ExecSQL;
Estrazione:
"SELECT
SP_BASEFREQUENCY,
SP_ACC_X, SP_ACC_Y, SP_ACC_Z, SP_SEA
FROM SPECTRUMS
WHERE SP_ID = :SpectrumId;"
// NB: aStr viene creato ma non distrutto: vedi help di CreateBlobStream
var aStr: TStream;
...
with qrySelectSpectrum do begin
...
 Active := True;
 if not EOF then begin
   BaseFreq := FieldByName('SP_BASEFREQUENCY').AsFloat;
   aStr := CreateBlobStream(FieldByName(SpectrumFieldName), bmRead);
   // riavvolge il blob e va alla fine per vedere il size
   aStr.Seek(0, soFromBeginning);
   aStr.Seek(0, soFromEnd);
   blobSize := aStr.Size;
   NumSamples := blobSize div sizeof(single);
   SetLength(Dest, NumSamples);
   aStr.Seek(0, soFromBeginning);
   // estrazione dei dati contenuti nel blob (array di single)
   for i := 0 to NumSamples-1 do begin
     aStr.Read(sVal, sizeof(sVal));
     Dest[i] := sVal;
   end;
 end;
 Active := False;
end;
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare"