PDA

Visualizza la versione completa : [DELPHI] Dimensione del file allocato su download di un campo BLOB


FengHuang
03-05-2012, 12:00
ebbene sì, ancora io :facepalm:

La situazione è la seguente:

Form1.q1ZPRFILE.Active := True;
Form1.q1ZPRFILE.SaveToFile(Form1.NomeFile);

dove Form1.q1ZPRFILE è un TBlobField di un oggetto TSQLQuery.

il mio problema è questo:

il SaveToFile può durare parecchio, anche svariati minuti se chi si collega al DB è in remoto via internet e io avrei bisogno di sapere a che punto è del DL.

il SF viene eseguito in un thread apposito quindi il programma che lo ha eseguito è in grado di operare e io speravo che andando ad analizzare ogni tot tramite un TTimer la dimensione del file che si sta salvando con un

fsFile := TFileStream.Create(NomeFile, fmOpenRead or fmShareDenyNone);
try
Result := fsFile.Size;

potessi vedere il progresso ma il programma mi risponde picche dicendo che (ovviamente) il file è allocato da un altro processo.

Come Posso fare?

FengHuang
07-05-2012, 10:50
quì sono ancora arenatissimo :(

nessuna idea?

alka
07-05-2012, 11:00
Originariamente inviato da FengHuang
il SaveToFile può durare parecchio, anche svariati minuti se chi si collega al DB è in remoto via internet e io avrei bisogno di sapere a che punto è del DL.
Non mi pare una buona idea collegarsi tramite Internet al database, sia per una questione di sicurezza che di performance, a prescindere dal database utilizzato.

Meglio predisporre un server che si colleghi "localmente" al database e restituisca - via Web Service, JSON, socket TCP, ecc. - il file richiesto; invocando il servizio, ad esempio con Indy Components, si può monitorare il processo di download (perché in quel caso è un *vero* download).


Originariamente inviato da FengHuang
io speravo che andando ad analizzare ogni tot tramite un TTimer la dimensione del file che si sta salvando [...] ma il programma mi risponde picche dicendo che (ovviamente) il file è allocato da un altro processo.

Mentre stai salvando il file, oltre a risultare questo "bloccato", è probabile che fino a quando non viene chiuso (sbloccato) al termine della procedura, questo risulti anche di dimensione zero.

Secondo me, dovresti strutturare in modo diverso questa architettura.

Se possiedi una versione di Delphi 2010 superiore alla Professional, ad esempio, potresti fare uso di DataSnap.

Ciao! :ciauz:

FengHuang
07-05-2012, 11:19
Originariamente inviato da alka
Non mi pare una buona idea collegarsi tramite Internet al database, sia per una questione di sicurezza che di performance, a prescindere dal database utilizzato.

Meglio predisporre un server che si colleghi "localmente" al database e restituisca - via Web Service, JSON, socket TCP, ecc. - il file richiesto; invocando il servizio, ad esempio con Indy Components, si può monitorare il processo di download (perché in quel caso è un *vero* download).

in origine era così in effetti poi abbiamo avuto tutta un'altra serie di problemi e dopo svariati tentativi son passato alla connessione e DL via DB...
diciamo che per ora sono abbastanza "vincolato" a fare così anche se non è proprio splendido...



Originariamente inviato da alka Mentre stai salvando il file, oltre a risultare questo "bloccato", è probabile che fino a quando non viene chiuso (sbloccato) al termine della procedura, questo risulti anche di dimensione zero.

confermo, quantomeno, se chiedo le proprietà a wincozz durante il DL mi restituisce 0...


Originariamente inviato da alka
Se possiedi una versione di Delphi 2010 superiore alla Professional, ad esempio, potresti fare uso di DataSnap

Ovvero? :confused: io ho una Enterprise...

alka
07-05-2012, 12:03
Originariamente inviato da FengHuang
diciamo che per ora sono abbastanza "vincolato" a fare così anche se non è proprio splendido...

In tal caso, devi agire manualmente sullo Stream da cui scarichi i dati: invece di fare un salvataggio diretto nello Stream associato al file, eseguire delle Read/Write per copiare i dati "a blocchi" rendicontando poi nell'interfaccia quanti byte hai trasferito, fino al loro esaurimento.

Se utilizzi i metodi Load/Save, l'operazione sarà "atomica", cioè gestirà internamente questo processo senza consentirti di conoscerne lo stato.


Originariamente inviato da FengHuang
Ovvero? :confused: io ho una Enterprise...
Vedi la documentazione (http://docwiki.embarcadero.com/RADStudio/en/DataSnap_Overview_and_Architecture).

FengHuang
07-05-2012, 12:22
Originariamente inviato da alka
Se utilizzi i metodi Load/Save, l'operazione sarà "atomica", cioè gestirà internamente questo processo senza consentirti di conoscerne lo stato.

Direi che se non c'è deroga a questo status-quo mi hai risposto :(

o passo al read-write via stream oppure carico una progress-bar ciclica giusto per far vedere l'attività e sto così.

Grazie per ora :D

Loading