Newsgroup: it.comp.appl.access
Titolo: rs.close + set rs=nothing mi crea un errore sulla form

Ciao a tutti.
per provare un po' la differenza in termini di memoria stavo aggiungendo 
  l'istruzione rs.close a tutte le parti di modulo in cui aprivo un 
recordset.
Quindi la situazione passava da
set rs = nothing a
rs.close
set rs = nothing
Il problema è che questa aggiunta non mi permette il regolare 
funzionamento della maschera che mi ritorna tutti i controlli associati 
come ?nome
Il recordset in questione non è in alcuno modo associato alla maschera 
ma serve per altre query interne a una sub.
Mi sapete aiutare?
Grazie

 set rs = nothing
Non capisco perchè tu debba chiudere 2 volte un recordset. Per quel che ne sappia io, l'unica 
differenza è che "set rs=nothing" per quante volte tu lo faccia eseguire non genera errore, mentre 
"rs.close" è consentito una volta sola e solo se rs è aperto.
Dall'help di DAO 3.6:
"An alternative to the Close method is to set the value of an object variable to Nothing (Set 
dbsTemp = Nothing)."
E comunque se utilizzi i recordset come variabili locali, una volta terminata la routine viene 
chiuso automaticamnete il recordset.
Se è diverso da come dico, fammelo sapere.
Michele 

 Se è diverso da come dico, fammelo sapere.
ah dire il vero anch'io ho sempre utilizzato set rs = nothing. Ho voluto 
provare l'altro metodo perchè leggendo per altre ragioni vecchi post mi 
era venuta la pulce nell'orecchio.
La mia domanda era solo curiosità...per il db sono già tornato al 
vecchio metodo funzionante

Silver ha scritto:

Il metodo Close chiude il Recordset, mentre forzare a Nothing l'oggetto
serve a liberare
memoria...!
In sostanza potrebbe bastare Nothing, io però uso entrambi con un
controllo:
   If rs Is Nothing Then rs.Close
   Set rs = Nothing
Saluti
@Alex

 recordset.
Il metodo Close chiude il Recordset, mentre forzare a Nothing l'oggetto
serve a liberare
memoria...!
In sostanza potrebbe bastare Nothing, io però uso entrambi con un
controllo:
   If rs Is Nothing Then rs.Close
   Set rs = Nothing
Saluti
@Alex
Ciao Alex, vedo che c'è ancora qualcuno nel NG.... appena tornato dalla trattoria? Ma si dai, diamo 
un'occhiata al NG prima di andare a dormire!
Sicchè tu dici che forzare l'oggetto a Nothing libera memoria.... ma il fatto che accennavo io 
riguardo alle variabili locali, cioè che si annullano una volta eseguita la routine, se non vengono 
"nothingate" continuano lo stesso ad occupare memoria, e questo fino alla chiusura di Access? Io di 
solito alla chiusura di ogni routine eseguo un db.close, e questo implica la chiusura di tutti gli 
oggetti che vi sottostanno, recordset compresi. Con tutti i recordsets che apro è veramente il caso 
di usare il Nothing pena la riduzione di prestazione?
E poi perchè esisterebbero i metodi close se questi sono peggiori del metodo tradizionale?
Michele 

Michele (Giò) ha scritto:

Non ho ben capito quello che dici...!
In una Form hai 2 possibilità di dichiarare Oggetti:
1) A livello di Modulo
2) A livello di Metodo(Sub o Function)
Nel 1° caso gli oggetti hanno la persistenza dell'Oggetto Padre(Form),
nel 2° si chiudono con il termine del metodo.
Purtroppo io provengo da linguaggi e da tempi in cui liberare la
memoria era la prima preoccupazione...
ed ancora oggi sono così...!
Se apri un oggetto DB e sotto diversi RS, da quanto ne sò alla
chiusura di DB diventano irreperibili
anche i RS ma non hai liberato memoria allocata perdi solo il Pointer
ai dati...!
E' pur vero che diventa memoria riscrivibile, ma in pratica mantieni un
livello di allocazione alto inutilmente... che deteriora le
prestazioni.
Il problema del riempimento dello Stack o della Ram è sempre meno
visibile, ma prova a fare una funzione ricorsiva di scansione dell'HD
dichiarando le variebili in modo errato, oppure prova sempre
ad eseguire una ricorsione su un Recordset in memoria...!!!
Io preferisco razionalizzre il codice, metto i miei bravissimi CLOSE e
NOTHING, limitando sempre al minimo l'uso di Oggetti o Variabili a
livello di modulo o Globali...!
Saluti
@Alex

 > recordset.
Io preferisco razionalizzre il codice, metto i miei bravissimi CLOSE e
NOTHING, limitando sempre al minimo l'uso di Oggetti o Variabili a
livello di modulo o Globali...!
Saluti
@Alex
Caro Alex, ti chiedo scusa di fronte a tanta onnipotenza.
Stamattina ho perso mezz'ora su MSDN per avere conferma di quello che si dice in questo topic.... 
certo che quelli alla microsoft certo non si sono sprecati. Se uno non ha l'input, o adopera certi 
strumenti e non altri, certe informazioni non le potrà mai sapere....
La prima cosa che ho trovato è questa:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthclose.asp
--------------------------------------------------------------------------------------------
Remarks
Use the Close method to close a Connection, a Record, a Recordset, or a Stream object to free any 
associated system resources. Closing an object does not remove it from memory; you can change its 
property settings and open it again later. To completely eliminate an object from memory, set the 
object variable to Nothing (in Visual Basic) after closing the object.
-------------------------------------------------------------------------------------------
La seconda e ultima cosa invece:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchperfopt.asp
-------------------------------------------------------------------------------------------
Reducing Memory Consumption
It is important to keep the amount of your executable code to a minimum. You might also need to 
reduce the memory requirements of your application's data. Such reductions often improve 
performance, because smaller executables usually run faster, and eliminating memory swaps increases 
execution speed. In this respect, you might be able to profit from the following recommendations:
  a.. Minimize the number of forms that are loaded simultaneously. Delay the loading of a form until 
it is needed, unless you wish to optimize the perceived display speed. When you are finished with a 
form, unload it and set the variable to Nothing.
  b.. When you are finished with a variable of a large data type, set it to Nothing. This applies 
especially to strings, arrays, and other potentially large objects.
-------------------------------------------------------------------------------------------
Dato che sto revisionando il mio db dalla cima ai piedi, vedrò di seguire i tuoi suggerimenti.
Saluti
Michele

 Caro Alex, ti chiedo scusa di fronte a tanta onnipotenza.
Di onnipotente ce ne è stato uno solo... io ho già passato i 33
anni...! ;-)

Si entrambe le note sono la base, ora non ricordavo i Links MS, ma mi
rifacevo alle nozioni base
di programmazione Assembler di 20 anni fà.... quando conoscevo i
processori e le modalità di salvataggio dati in memoria....
Del resto se rileggi bene le considerazioni sono anche ovvie, è
normale che riducendo il numero di oggetti
aperti in memoria l'esecuzione sia più veloce...!!!
Complimenti per la costanza nella ricerca.
Ciao
@Alex

 ha scritto nel messaggio 
news:1159695145.4...@m7g2000cwm.googlegroups.com...
..........
Del resto se rileggi bene le considerazioni sono anche ovvie, è
normale che riducendo il numero di oggetti
aperti in memoria l'esecuzione sia più veloce...!!!
Complimenti per la costanza nella ricerca.
Ciao
@Alex
Penso che il problema sia da affiancare, anche se solo in linea di principio, al risparmio di 3MB 
ogni 3 milioni di records che volevo fare l'altro giorno....
Si diceva che oggi gli HDD da 200 GB sono su tutte le macchine.....
Oggi avere 512 MB di RAM è il minimo, e i processori se li lasci senza ventilazione per 5 secondi 
rischi di bruciarli da quanto forte corrono, ma il morale della favola in tutti e due i casi è che 
bisogna sempre pensare di avere una carriola che esegue il tuo codice, poi se è una Ferrari, a pro 
delle prestazioni allora. L'importante è avere l'approcio il più coerente possibile alla 
programmazione, e questo chiedendosi sempre il perchè di tutte le soluzioni.
Buona giornata
Michele 

 ha scritto nel messaggio 
news:1159653724.9...@i42g2000cwa.googlegroups.com...
Il metodo Close chiude il Recordset, mentre forzare a Nothing l'oggetto
serve a liberare
memoria...!
In sostanza potrebbe bastare Nothing, io però uso entrambi con un
controllo:
   If rs Is Nothing Then rs.Close
   Set rs = Nothing
Saluti
@Alex
Scusa Alex, tu che sei pratico di moduli di classe.....
se io dispongo di un tale modulo di nome ClsProva (Nome a caso) sotto al quale adopero vari oggetti 
e variabili e vado a dichiarare una variabile che lo usa:
dim Var1 as new ClsProva
per risparmiare memoria il metodo giusto è semplicemente settare a nothing Var1 una volta ultimato 
il servizio, oppure su Class_Terminate devo anche settare a Nothing ogni oggetto che è stato usato 
all'interno del modulo? Mi verrebbe da dire la seconda.......
Saluti
Michele