J'utilise Access 2003 pour accéder aux données stockées dans une base de données SQL Server via ADO. Le plus souvent, j'obtiens les données en utilisant des procédures stockées. J'exécute les procédures stockées via ADO dans une fonction distincte qui renvoie un jeu d'enregistrements. Lors du renvoi d'un jeu d'enregistrements à partir d'une fonction où est le meilleur endroit pour fermer le jeu d'enregistrements et libérer il est en mémoire? Est-ce fait dans la fonction qui retourne le jeu d'enregistrements ou est-ce fait dans la sous/fonction qui appelle la fonction exécutant le code ADO? Voici un exemple ...Façon correcte de fermer le jeu d'enregistrements ADO dans Access lors du passage à la méthode d'appel?
Voici la méthode d'appel
Public Sub CallingMethod()
Dim rs As ADODB.Recordset
Set rs = GetDataFromDatabase()
Set myListBox.Recordset = rs
rs.Close
Set rs = Nothing
End Sub
Voici la méthode qui exécute effectivement la procédure stockée et retourne à la méthode d'appel
Public Function GetDataFromDatabase()
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.ConnectionString = myConnectionString
cnn.Open
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cnn
rs.Source = "EXEC uspMyStoredProcedure"
rs.LockType = adLockOptimistic
rs.CursorType = adOpenStatic
rs.CursorLocation = adUseClient
rs.Open
Set GetDataFromDatabase = rs
Set rs = Nothing
Set cnn = Nothing
End Function
Ce que je me demande, c'est où je devrais fermer le jeu d'enregistrements et le mettre égal à rien. Est-ce que je le fais dans les deux endroits sans avoir besoin de? Je cherche juste les meilleures pratiques. Je vous remercie.
Vous avez deux jeux d'enregistrements différents, autant que je peux voir, donc les deux doivent être fermés oui non? – Fionnuala
Une fonction sans type de retour déclaré indique une pensée floue par quelqu'un quelque part le long de la ligne. Si vous voulez une variante (qui est le type de retour par défaut), déclarez-la explicitement en tant que variante. Mais vous n'avez pas ici, vous voulez que ce soit un ADO.Recordset. Voir la solution @ HansUp ci-dessous, qui me semble être la bonne approche. –
Merci David! Vous faites un très bon point. J'ai créé la fonction pour illustrer mon point et j'ai oublié d'inclure le type de retour de ADODB.Recordset. Bonne prise. – webworm