Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
879 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°864755
CrashSerge
J'ai 143 cellules...wooooow!
Posté le 05-10-2004 à 03:46:10  profilanswer
 

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

mood
Publicité
Posté le 05-10-2004 à 03:46:10  profilanswer
 

n°872738
couitchy
Posté le 13-10-2004 à 21:44:54  profilanswer
 

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
n°872883
mareek
Et de 3 \o/
Posté le 14-10-2004 à 01:02:11  profilanswer
 

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
n°873721
couitchy
Posté le 14-10-2004 à 22:10:46  profilanswer
 

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é
?

n°873791
glod 2
Votre trajet, notre projet.
Posté le 15-10-2004 à 00:29:32  profilanswer
 

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

n°873792
mareek
Et de 3 \o/
Posté le 15-10-2004 à 00:39:27  profilanswer
 

+1


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
n°874492
couitchy
Posté le 15-10-2004 à 22:12:04  profilanswer
 

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
n°875191
mareek
Et de 3 \o/
Posté le 17-10-2004 à 17:04:42  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[Conseils] Livres Visual BasicBonjour je souhaite créer un site internet avec un ami: conseils svp
[Résolu - ADO] Problème de connexion à un serveur OLAP[HTML] Conseils look & feel pour une appli manager
[VB][ADO] Erreur Data LinkProblème de récupération Excel avec un recordset ADO
[Livres] Conseils de Lecture sur la Modélisation[Livres] Conseils de lecture pour débuter en Java ?
[ASP] [SQL] [ADO] paramètres de commandeConseils programmation VBA - Comment résoudre mon problème !
Plus de sujets relatifs à : ADO dans VB-6 professionel. Conseils demandés.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR