2010-06-29 18 views
3

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.

+0

Vous avez deux jeux d'enregistrements différents, autant que je peux voir, donc les deux doivent être fermés oui non? – Fionnuala

+3

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. –

+0

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

Répondre

5

Je ne suis pas sûr ce qui est bon, soit. J'ai essayé une approche où le code appelant crée l'objet de connexion et le passe à la fonction. L'appelant est responsable de disposer des objets de connexion et d'ensemble d'enregistrements. C'est rapide parce que je ne voulais pas investir plus pour découvrir que mon approche est tout bête.

Public Sub test_GetDataFromSP() 
    Dim cnn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set cnn = New ADODB.Connection 
    cnn.ConnectionString = "DRIVER=SQL Server;SERVER=VM2003\SQLEXPRESS;" & _ 
     "Trusted_Connection=Yes;DATABASE=Inventory" 
    cnn.Open 
    Set rs = GetDataFromSP("GetCenterCodes", cnn, "14, 14, 501") 
    rs.MoveLast 
    Debug.Print rs.RecordCount 
    rs.Close 
    Set rs = Nothing 
    cnn.Close 
    Set cnn = Nothing 
End Sub 

Public Function GetDataFromSP(ByVal pProc As String, _ 
    ByRef pConnection As ADODB.Connection, _ 
    Optional ByVal pArguments As String) As ADODB.Recordset 

    Dim rs As ADODB.Recordset 
    Dim strStatement As String 

    strStatement = "EXEC " & pProc 
    If Len(pArguments) > 0 Then 
     strStatement = strStatement & " " & pArguments 
    End If 
    strStatement = strStatement & ";" 
    Set rs = New ADODB.Recordset 
    Set rs.ActiveConnection = pConnection 
    rs.Source = strStatement 
    rs.LockType = adLockOptimistic 
    rs.CursorType = adOpenStatic 
    rs.CursorLocation = adUseClient 
    rs.Open 
    Set GetDataFromSP = rs 
End Function