Comment retourner un jeu d'enregistrements à partir d'une fonction
Je suis en train de construire une couche d'accès aux données dans Excel VBA et avoir du mal à revenir à un jeu d'enregistrements. Le Execute() de la fonction de ma classe est certainement la récupération d'une ligne à partir de la base de données, mais ne semble pas être de retourner quoi que ce soit.
La fonction suivante est contenue dans une classe appelée DataAccessLayer. La classe contient les fonctions de Connecter et de Déconnecter la poignée d'ouverture et de fermeture de la connexion.
Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
Dim rs As ADODB.recordset
Set rs = New ADODB.recordset
Dim recordsAffected As Long
' Make sure we're connected to the database.
If Connect Then
Set command = New ADODB.command
With command
.ActiveConnection = connection
.CommandText = sqlQuery
.CommandType = adCmdText
End With
'Set rs = command.Execute(recordsAffected)
'Set Execute = command.Execute(recordsAffected)
rs.Open command.Execute(recordsAffected)
rs.ActiveConnection = Nothing
Set Execute = rs
Set command = Nothing
Call Disconnect
End If
End Function
Voici une fonction publique que je suis en utilisant dans la cellule A1 de ma feuille de calcul pour les tests.
Public Function Scott_Test()
Dim Database As New DataAccessLayer
'Dim rs As ADODB.recordset
'Set rs = CreateObject("ADODB.Recordset")
Set rs = New ADODB.recordset
Set rs = Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
'rs.Open Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
'rs.Open
' This never displays.
MsgBox rs.EOF
If Not rs.EOF Then
' This is displaying #VALUE! in cell A1.
Scott_Test = rs!item_desc_1
rs.Close
End If
rs.ActiveConnection = Nothing
Set rs = Nothing
End Function
Ce que je fais mal?
OriginalL'auteur Scott | 2010-03-17
Vous devez vous connecter pour publier un commentaire.
Le problème était avec le réglage de la ActiveConnection = Rien. Le code suivant fonctionne:
OriginalL'auteur Scott
crée un pointeur de jeu d'enregistrements, vous fermez à la sortie de la fonction.
C'est pourquoi il ne peut pas contenir quoi que ce soit.
Je suis aussi relectant sur vos noms de variables qui sont identiques à possibe mots réservés (recordset). Je l'utilise généralement rs ou rsIn ou rsWhateverYouWant...
OriginalL'auteur Patrick Honorez
Comme mentionné par Patrick, le jeu d'enregistrements est un pointeur.
L'Appelant 'Scott_Test' doivent appeler le jeu d'enregistrements.Proche place.
La méthode Execute NE peut pas appeler un jeu d'enregistrements.À proximité, cependant, je crois que c'est OK pour quitter le jeu d'enregistrements.ActiveConnection = Rien
OriginalL'auteur user52212