Newsgroup: it.comp.lang.visual-basic
Titolo: Memoria esaurita ... e ado data control!

Ciao, tramite adodc ho creato una connessione ad un server oracle. Mi
serve per interrogare delle tabelle molto grandi. Dopo aver lanciato la
query sql, mi appare la msgbox con la frase 'Memoria esaurita'. Esiste
una soluzione oppure per tabelle estremamente popolate non è possibile
usare Ado ? Grazie
PS: La query che invio ad adodc è la seguente :
Select * from utilizzazione_terreno where cod_azienda in  (Select
cod_azienda from centro_aziendale where cod_prov = '058' and
flag_cancellato is null) and (cod_liv1 = '08' and cod_liv3 = '53') or
(cod_liv1 = '09' and cod_liv3 = '79') or (cod_liv1 = '10' and cod_liv3 =
'83') or (cod_liv1 = '12'  and cod_liv3 = '84') or (cod_liv1 = '13' and
cod_liv3 = '87') or (cod_liv1 = '14' and cod_liv3 = '94') or (cod_liv1 =
'15' and cod_liv3 = '97') or (cod_liv1 = '16' and cod_liv3 ='98') or
(cod_liv1 = '17' and cod_liv3 = '99')
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

BASTET ha pensato forte :

Non entro nel merito della query (che innanzitutto non farei con 
l'asterisco), perchè teoricamente potrebbe anche essere la migliore 
possibile per la tua logica.
Il punto è che presumo il tuo software si scarichi integralmente in RAM 
tutto il risultato della query, il che potrebbe anche essere tanta 
roba.
Però, il punto è: se è tanta roba, sei sicuro che debba essere 
scaricata sul client?
Se va in una griglia, non ha senso metterci troppa roba.
Se serve per muoversi fra i record, allora potresti benissimo scaricare 
i dati in maniera paginata, lasciando al server Oracle la gestione del 
cursore.
Tutto questo, però, lo si può fare aprendo un recordset da codice. 
Utilizzando un ADODC, sono convinto che esisterà il modo, ma non so 
dirti come perchè non l'ho mai fatto.
In linea di principio, comunque, inizierei dalla logica, per verificare 
se non sia possibile operare mediante l'estrazione di sottoinsiemi dei 
dati, anzichè tutti insieme.
Ciao
Alberto

Ciao, sicuramente la query non è il massimo (è solo una prova). Non mi
servono griglie od altro .... il risultato
lo devo semplicemente caricare in un file txt con ';' come separatore
dei campi. Ho provato ad
utilizzare anche una sola condizione 'or' ma il risultato è sempre
'memoria esaurita'. Tieni
presente che lavoro con tabella con milioni di record. Grazie. 


 presente che lavoro con tabella con milioni di record.
Questo lo immaginavo.
Ti direi di andare in una delle due direzioni:
- Fare eseguire l'esportazione direttamente da Oracle senza passare per 
il lato client
- Ottenere il recordset paginato ed esportare le singole pagine man 
mano che arrivano.
Personalmente, andrei sicuramente per la prima strada. A meno che il 
server Oracle non sia su reti diverse per cui il file generato diventa 
inaccessibile.
Ciao
Alberto
-- 
Max Beerbohm: Tutto ciò che è degno di essere fatto è stato fatto 
ripetutamente. Dalle cose mai fatte bisognerebbe tenersi, sospetto, 
molto alla larga.

... risolto! era sbagliata la query ... l'ho modificata ed ora funziona
benissimo.
Dovevo chiaramente raggruppare tutte le condizioni or all'interno di
parentesi.
Select * from utilizzazione_terreno where cod_azienda in  (Select
cod_azienda from
 centro_aziendale where cod_prov = '058' and flag_cancellato is null)
and ((cod_liv1 = '08'
 and cod_liv3 = '53') or (cod_liv1 = '09' and cod_liv3 = '79') or
(cod_liv1 = '10' and cod_liv3 = '83')
 or (cod_liv1 = '12'  and cod_liv3 = '84') or (cod_liv1 = '13' and
cod_liv3 = '87') or
(cod_liv1 = '14' and cod_liv3 = '94') or (cod_liv1 = '15' and cod_liv3 =
'97') or
(cod_liv1 = '16' and cod_liv3 ='98') or (cod_liv1 = '17' and cod_liv3 =
'99'))


> come separatore dei campi.
Beh .. apri un recordset ADO da codice utilizzando un
cursore lato server e di tipo forward only / read only
quindi usa il metodo getstring per leggere i records
"a blocchi" già formattati con i separatori che desideri
per capirci; assumendo che "rs" sia il tuo recordset
e che "fp" sia l'handle del file di testo da scrivere
    While Not rs.EOF
        sData = rs.GetString(adClipString, 100, ";", vbCrLf, "")
        Print #fp, sData;
        rs.MoveNext
    Wend
in questo modo leggerai 100 records alla volta nella
stringa "sData"; i campi di ciascun record saranno
separati da ";" ed i singoli records da CR/LF; i valori
NULL verranno rimpiazzati da stringhe vuote; il tutto
senza dover manipolare direttamente i campi e senza
riempire la memoria caricando l'intero resultset :-)
Ciao