ADO dans VB-6 professionel. Conseils demandés.

ADO dans VB-6 professionel. Conseils demandés. - VB/VBA/VBS - Programmation

Marsh Posté le 05-10-2004 à 03:46:10    

Bonjour à tous,
 
J'ai besoin de conseil de gens qui utilisent ADO 2.5 et plus dans VB 6 de façon professionel. Je m'explique: Je suis analyste programmeur depuis plus de 8 ans et j'ai toujours travaillé avec des languages tel que PowerHouse, Progress. En gros ce sont des languages 4GL. Mais je n'ai jamais travaillé de façon professionel avec VB.  
 
A l'occasion je fait de petits contrats de programmation à la pige pour de petites boites et j'utilise VB 6 avec ADO 2.5 comme méthode d'accès aux données. Toutefois, je ne suis pas convaincus que j'utilise ADO de la meilleur façon qui soit. J'ai beau faire des recherches et lire dans mes livres de reférences, je voit des exemples qui illustre comment utiliser les objets RecordSet, Connection, Command et toutes les autres mais jamais en profondeur.
 
Exemple: Je fait les déclations suivantes dans la section de déclaration:
 
Dim Cn As New ADODB.Connection
Dim RsGame As New ADODB.Recordset
Dim RsResultatMstr As New ADODB.Recordset
 
Est-ce qu'il serait préférable de faire les déclarations dans des procédure internes du programme, dans les procédure d'événement, _Click ou _DblClick. Est-ce qu'il est préférable de ne pas déclarer d'objet Connection et d'en fabriquer une en même temps que le RecordSet. Entre chaque événement, est-il préférable de fermer le RecordSet a chaque fois ou de le garder ouvert.
 
1) Merci d'avoir pris le temps de me lire, c'est un peut long  ;)  
2) Merci de vos réponse :sol:  
 
Je joint le code d'un de mes programme pour vous donner un exemple.
 
Serge
 
Dim Cn As New ADODB.Connection
Dim RsGame As New ADODB.Recordset
Dim RsResultatMstr As New ADODB.Recordset
 
Private Sub CmdCancel_Click()
   Unload Resultat
End Sub
 
Private Sub CmdSave_Click()
   
    If RsResultatMstr.State = adStateOpen Then
       RsResultatMstr.Close
    End If
     
    RsResultatMstr.Open "Select * " & _
                        "From ResultatMstr " & _
                        "Where ResultatMstr.NoJoute = " & RsGame!nojoute & " and " & _
                        "      ResultatMstr.Annee = " & Year(RsGame!Date), Cn, adOpenDynamic, adLockOptimistic
                           
    If RsResultatMstr.EOF And RsResultatMstr.BOF Then
       RsResultatMstr.AddNew
    End If
     
    RsResultatMstr!annee = Year(RsGame!Date)
    RsResultatMstr!nojoute = RsGame!nojoute
    RsResultatMstr!ScoreLoc = ScoreLoc.Text
    RsResultatMstr!ScoreVis = ScoreVis.Text
   
    RsResultatMstr.Update
    RsResultatMstr.Close
   
End Sub
 
Private Sub Form_Load()
    Call SetGameScore("Init" )
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    Set Cn = Nothing
    Set RsGame = Nothing
End Sub
 
Private Sub ListGames_Click()
    Call GetGame
    Call ShowData(RsGame)
End Sub
 
Private Sub ListGames_DblClick()
    Call GetGame
    Call ShowData(RsGame)
End Sub
 
Private Sub SetGameScore(ByVal pType As String)
 
    Cn.ConnectionString = "driver=SQL server;" & _
                          "server=sergeserver;" & _
                          "uid=BASMMaster;pwd=BASMMaster;database=BasmTEST"
    Cn.Open
     
    RsGame.Open ("Select cal.noJoute, " & _
                "       cal.date, " & _
                "       cal.heure, " & _
                "       cal.statut, " & _
                "       EmL.shortname, " & _
                "       EmV.shortname " & _
                "from calendrier as cal, " & _
                "     EquipeMstr as EmL, " & _
                "     EquipeMStr as EmV " & _
                "Where Cal.EquipeLoc = EmL.NoEquipe and " & _
                "      Cal.EquipeVis = EmV.NoEquipe " ) _
                , Cn, adOpenForwardOnly
     
    Do While Not RsGame.EOF
       ListGames.AddItem (Format(RsGame("NoJOute" ), "#00" ) & " - " & RsGame!statut & " - " & RsGame("date" ) & "  " & RsGame(5) & "   Vs   " & _
                          RsGame(4) & "   à   " & RsGame("heure" ))
       ListGames.ItemData(ListGames.NewIndex) = RsGame("NoJoute" )
       RsGame.MoveNext
    Loop
     
    If pType = "Init" Then
       ListGames.ListIndex = 0
       RsGame.MoveFirst
       Call ShowData(RsGame)
    End If
     
    RsGame.Close
     
    Call GetGame
 
End Sub
 
Private Sub ShowData(ByRef pRsGame As ADODB.Recordset)
   TextNoJoute.Text = pRsGame!nojoute
   TextDate.Text = pRsGame!Date
   TextHeure.Text = pRsGame!heure
   TextEquipeVis.Text = pRsGame(5)
   TextEquipeLoc.Text = pRsGame(4)
End Sub
Private Sub ResetScore()
   ScoreLoc.Text = ""
   ScoreVis.Text = ""
End Sub
Private Sub ScoreLoc_GotFocus()
   ScoreLoc.Text = ""
End Sub
 
Private Sub ScoreVis_GotFocus()
   ScoreVis.Text = ""
End Sub
Private Sub SetScore(ByRef pRsResultatMstr As ADODB.Recordset)
   ScoreLoc.Text = pRsResultatMstr!ScoreLoc
   ScoreVis.Text = pRsResultatMstr!ScoreVis
End Sub
 
Private Sub GetGame()
   
   Call ResetScore
 
   If RsGame.State = adStateOpen Then
     RsGame.Close
   End If
   
   RsGame.Open "select cal.NoJoute, " & _
               "       cal.date, " & _
               "       cal.heure, " & _
               "       cal.statut, " & _
               "       EmL.NomEquipe, " & _
               "       EmV.NomEquipe " & _
               "from calendrier as cal, " & _
               "     EquipeMstr as EmL, " & _
               "     EquipeMStr as EmV " & _
               "Where cal.NoJOute = " & ListGames.ItemData(ListGames.ListIndex) & " and " & _
               "      Cal.EquipeLoc = EmL.NoEquipe and " & _
               "      Cal.EquipeVis = EmV.NoEquipe ", _
               Cn, adOpenDynamic
   
   If RsGame.State = adStateOpen Then
      If RsResultatMstr.State = adStateOpen Then
         RsResultatMstr.Close
      End If
       
      RsResultatMstr.Open "Select * " & _
                          "From ResultatMstr " & _
                          "Where ResultatMstr.NoJoute = " & RsGame!nojoute & " and " & _
                          "      ResultatMstr.Annee = " & Year(RsGame!Date), Cn, adOpenForwardOnly
      If Not RsResultatMstr.EOF And Not RsResultatMstr.BOF Then
         Call SetScore(RsResultatMstr)
      End If
   End If
End Sub

Reply

Marsh Posté le 05-10-2004 à 03:46:10   

Reply

Marsh Posté le 13-10-2004 à 21:44:54    

Je programme sous VB depuis quelques années maintenant et je me suis souvent posé ces mêmes questions ! N'ayant jamais trouvé de réponse satisfaisante, j'ai fini par faire :
- l'objet connexion en variable globale
- les recordsets en variables privées (dans des procédures simples mais jamais dans des évènements)
- je ne ferme jamais les recordsets mais je libère les ressources par un RS = nothing.
Mais je me demande toujours, lorsque la requête ne sélectionne qu'un enregistrement, s'il est préférable de faire une requête SQL "select" ou d'ouvrir toute la table en mémoire puis faire un FindFirst.


Message édité par couitchy le 13-10-2004 à 21:46:00
Reply

Marsh Posté le 14-10-2004 à 01:02:11    

couitchy a écrit :


- l'objet connexion en variable globale
- les recordsets en variables privées (dans des procédures simples mais jamais dans des évènements)


Pareil, c'est ce qu'il y a de plus logique AMHA (et c'est ce qui est conseillé dans les exemples MS).

couitchy a écrit :


- je ne ferme jamais les recordsets mais je libère les ressources par un RS = nothing.


C'est toujours plus propre de fermer un recordset quand on a fini de l'utiliser. Mettre une variable locale à nothing en fin de procedure est inutile, VB le fait automatiquement.  

couitchy a écrit :


Mais je me demande toujours, lorsque la requête ne sélectionne qu'un enregistrement, s'il est préférable de faire une requête SQL "select" ou d'ouvrir toute la table en mémoire puis faire un FindFirst.


Je vois pas de raison d'utiliser autre chose qu'un recordset, c'est quand même difficile de faire plus simple d'utilisation.
 
En règle générale, je n'utilise les recordset qu'en adOpenForwardOnly c'est ce qu'il y a de plus rapide et que les autres modes sont pratiquement inutiles à mes yeux. Autre astuce, mettre la propriété cursorlocation à adUseClient, ça permet d'éviter les aller retours inutiles entre le client et le serveur.
 
 
lien utile:
http://msdn.microsoft.com/library/ [...] frame=true


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 14-10-2004 à 22:10:46    

mareek a écrit :


 
Je vois pas de raison d'utiliser autre chose qu'un recordset, c'est quand même difficile de faire plus simple d'utilisation.
 


 
oui bien sûr ! je parlais d'utiliser un recordset dans les deux cas ! mais vaut-il mieux :
- ouvrir ton recordset contenant la table entière puis faire un truc genre findfirst pour trouver l'enregistrement qui t'intéresse
- ou bien faire une requête select
sachant que l'on sait qu'il n'y aura qu'un seul enregistrement retourné
?

Reply

Marsh Posté le 15-10-2004 à 00:29:32    

un select, et de loin. Moins de bande passante, moins de boulot pour tout le monde (sauf si le select est hyper complexe)

Reply

Marsh Posté le 15-10-2004 à 00:39:27    

+1


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 15-10-2004 à 22:12:04    

Glod 2 a écrit :

un select, et de loin. Moins de bande passante, moins de boulot pour tout le monde (sauf si le select est hyper complexe)


 
je ne demande qu'à être convaincu, mais imagine qu'en interne, le select ouvre toute la table en mémoire (ce qui peut être une hypothèse assez probable) ? pourquoi y aurait-il alors "moins de boulot pour tout le monde" ? :)


Message édité par couitchy le 15-10-2004 à 22:12:53
Reply

Marsh Posté le 17-10-2004 à 17:04:42    

couitchy a écrit :

je ne demande qu'à être convaincu, mais imagine qu'en interne, le select ouvre toute la table en mémoire (ce qui peut être une hypothèse assez probable) ? pourquoi y aurait-il alors "moins de boulot pour tout le monde" ? :)


Ben même si en interne le select ouvre toute la table en mémoire (et franchement si c'est le cas, il est grand temps de changer de SGBD), le select est encore avantageux vu qu'il n'est pas pire que l'autre méthode ?


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed