Newsgroup: it.comp.lang.visual-basic
Titolo: [?][ADO] Come si ritorna un Recordset da una funzione?

Ciao a tutti.
Ogni tanto ripasso :) Spero, il 28 giugno, di dirvi che sono a -3...
Dunque, veniamo velocemente al problema che ho. Piu' che un problema,
a dire la verita', e' un dubbio, visto che non so come vengono creati
ed allocati gli oggetti in Visual Basic.
Sto accedendo con ADO via ODBC ad un motore database. Inserisco ed
estraggo i dati con query in SQL.
Ora, pero', che le query cominciano ad essere una cifra in varie
applicazioni e mi risulta un po' difficile tenere traccia di eventuali
modifiche, cambio di database o robe del genere; inoltre, devo avere
una variabile globale che mi contiene l'ADODB.Connection, visto che la
utilizzo praticamente da ogni punto del codice e che la apro all'avvio
dell'applicazione per chiuderla solo al termine.
Allora mi sono detto: metto la ADODB.Connection come variabile privata
in un modulo e scrivo qualche funzioncina a cui passo le query da fare
sul database: costruisco le istruzioni SQL nel codice dove ho bisogno
e chiamo una funzione per lanciare la insert, la update o chi per
loro. Finche' si tratta di update, delete ed insert tutti i santi
aiutano: il problema viene quando faccio una select, visto che la
funzione SelezionaRecord (IstruzioneSQL as string, blablabla) ritorna
un risultato di tipo ADODB.Recordset. Con le altre istruzioni SQL
posso ritornare un intero per dire se tutto e' andato bene oppure non
ritornare un tubo --che e' normalmente la mia scelta =)--.
In questo caso, come mi devo comportare? Nel codice ho:
Public Sub LeggiIDUltimaNota()
Dim Rs As ADODB.Recordset
Dim IstruzioneSQL As String
 
    IstruzioneSQL = "SELECT id FROM ultimi_id WHERE
descrizione_id='nota_macchina_speciale';"
 
    Set Rs = EstraiRecord(IstruzioneSQL)
    With Rs
        DbVars.IDNota = .Fields(0).Value
    End With
    Rs.Close
 
    Set Rs = Nothing
 
End Sub
Ah, gia' che ci siamo, mi dite di nuovo perche'
Dim Rs as ADODB.Recordset
Set Rs as new ADODB.Recordset
e' preferibile a
Dim Rs as New ADODB.Recordset?
Ecco, il dubbio che ho e': ho gia' pulito e cancellato *tutti* gli
oggetti in memoria? La mia funzione SelezionaRecord per ritornare un
ADODB.Recordset deve per forza allocarne uno, che io poi ricevo nel
codice principale in Rs. Pero', poi, questo recordset temporaneo come
lo cancello?
La mia funzione e':
Public Function EstraiRecord(IstruzioneSQL As String) As
ADODB.Recordset
Dim Comando As ADODB.Command
 
    Set Comando = New ADODB.Command
    Set EstraiRecord = New ADODB.Recordset
 
    Comando.ActiveConnection = Db.Connessione
    Comando.CommandText = IstruzioneSQL
 
    EstraiRecord.Open Comando, , adOpenKeyset, adLockOptimistic
 
    Set Comando = Nothing
 
End Function
Grazie in anticipo :)
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-VI --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 writes:
GR> Ciao a tutti.
GR> Ogni tanto ripasso :) Spero, il 28 giugno, di dirvi che sono a -3...
GR> Public Sub LeggiIDUltimaNota()
GR>     Dim Rs As ADODB.Recordset
GR>     Dim IstruzioneSQL As String
GR>     IstruzioneSQL = "SELECT id FROM ultimi_id WHERE descrizione_id='nota_macchina_speciale';"
GR>     Set Rs = EstraiRecord(IstruzioneSQL)
Immagino che tu qui abbia garantito un recordset con almeno una riga
ed il campo 0 not NULL...
Io di solito torno un recordset (al + vuoto) se non ci sono errori,
nothing altrimenti.
GR>     With Rs
GR>         DbVars.IDNota = .Fields(0).Value
GR>     End With
GR>     Rs.Close
GR>     Set Rs = Nothing
GR> End Sub
GR> Ah, gia' che ci siamo, mi dite di nuovo perche'
GR> Dim Rs as ADODB.Recordset
GR> Set Rs as new ADODB.Recordset
GR> e' preferibile a
GR> Dim Rs as New ADODB.Recordset?
Hmmm,  mi sa  che la  memoria viene  gestita peggio,  o  peggio alloca
troppa roba sullo stack... 
GR> Ecco, il dubbio che ho e': ho gia' pulito e cancellato *tutti* gli
GR> oggetti in memoria? La mia funzione SelezionaRecord per ritornare un
GR> ADODB.Recordset deve per forza allocarne uno, che io poi ricevo nel
GR> codice principale in Rs. Pero', poi, questo recordset temporaneo come
GR> lo cancello?
Se VB  funziona correttamente  quando esci da  SelezionaRecord() viene
eliminato un riferimento al recordset quindi rimangono solo quelli che
indichi  esplicitamente. Una  volta  tolti anche  quelli  c'è solo  da
aspettarsi che passi il camion della spazzatura.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

distruggerlo e liberare memoria (incrociando le dita).
Perfetto. Era quello che speravo --ed immaginavo--.
Come sempre, ti ringrazio per la risposta.
Casomai dovessi riuscire ad incontrarti, ti devo una Guinness .)
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!


per avere coerenza tra cose che coerenti non lo sono.
Mi rendo conto anche io che il senso e' relativo, ma avere 4 funzioni
di cui 3 sono uguali e 1 e' diversa mi richiede 4 byte di ram nel mio
--fuso-- cervello per ricordarmelo oppure un minimo di attenzione per
seguire quel che il popup di Visual Studio mi suggerisce :P
Nonostante i nomi di variabili e procedure --veramente dumbproof,
secondo me--, ogni tanto riesco a sbagliare qualche parametro o
qualche chiamata a funzione... Oramai conosco i miei polli --=
neuroni-- e bisogna che renda loro le cose piu' facili possibile.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!


 Un altro consiglio: dopo averlo scaricato, leggilo!
ecco, quando dicevo "una rara capacita' di centrare il punto" ...
mea culpa mea culpa mea maxima culpa...