ADO dans VB-6 professionel. Conseils demandés. - VB/VBA/VBS - Programmation
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.
Marsh Posté le 14-10-2004 à 01:02:11
couitchy a écrit : |
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 : |
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 : |
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
Marsh Posté le 14-10-2004 à 22:10:46
mareek a écrit : |
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é
?
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)
Marsh Posté le 15-10-2004 à 00:39:27
+1
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" ?
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 ?
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
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