j'ai cherché tr`se longtemps une connection à une base de donnée accès fiable. Après avoir rien trouver, j'ai décider de fabriquer mon propre module avec ses propres outils.
faut savoir qu,il y a 2 façon de se connecter à une base de donnée, soit a connections unique ou soit avec une connection permanente.
moi, c'est pour se connecter à une base de donnée temporaire, donc je veux être connecté en tout temps à ma base de donnée, puisque sinon, lors de la création d'un reccordset, faut se reconnecter à la base tout le temps et ont perd un temps fou
Donc avec une connection permanente, le temps de connection sest null, c'est extrêment rapide. En plus, l'accès à la base est pas exclusive dasn mon code, donc ont peut avoir une base de donnée sur nu réseau et utiliser ma connection
ceux qui se sont connecter à une base ded onnée en accès sur un gros programme ont du recontrer un problème, le nombre de connections est limité. Ce qui veux dire, même si on ferme nos reccordset, les connections s'accumule et le programme fini par planter avec comme message, trop de connections. Mo module règle le problème, s'il y a un surplus de connection, il se déconnecte et se reconnecte à la base de donnée pour libérer ses connection. Après pus de problème, jusqu'à la prochaine overdose de connection.
j'ai aussi remarquer, malgré que les reccordset sont pareil a VB6.0 ou VBA, certaine fonction ne marche pas. J'ai crée des parade pour avoir les même fonctionnalité.
le problème avec les modules pour se connecter à une base de donnée, c'est que le nombre de reccordset est limité. moi pas. Je peux avoir autant de erccordset que je veux.
un autre problème, certain module permet de récupéré quand ça plante, sauf dès qu'on ferme la base de donnée, tout les reccordset se ferme. Et s'il ré-ouvre les reccordset, ben il les repositionne pas, puisque dasn un programme, s'il a fait 10 movenext et il le remet à l'enregistrement 0, ben ça fais pleins d'erreur. Moi il connait en totu temps sa requête et sa position, s,il plante, il ferme tout, ré-ouvre chaque reccordset et les repositionne au bon endroit. Donc même si la connection plante, on verra un petit ralentissement a cause de la reconnection, mais aucune erreur va survenir et le programme plantera pas.
Source / Exemple :
'Imports DAO
Module BaseDonnee
Public drd1() As ADODB.Recordset
Private OleDbConnection1 As ADODB.Connection
Private SelectRSTtemp() As String
Private nbFois() As Boolean 'savoir si c'est la première lecture
Private position() As Integer 'connaitre la position dasn le reccordset
Private ouvert As Boolean = False 'savoir si la base de donnée est ouverte
#Region "Connection à la base de donnée"
Private Sub connection()
OleDbConnection1 = New ADODB.Connection
OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=secure;Data Source=" & Constante.baseDonnee & _
";Persist Security Info=False;Jet OLEDB:System database=" & Constante.SystemData & ";Password=" & Constante.pass & ";User ID=" & Constante.logon
OleDbConnection1.Open()
End Sub
#End Region 'Connection à la base de donnée
#Region "Création du Reccordset"
Public Sub ouvertureRST(ByVal SelectRST As String, Optional ByVal numero As Integer = 0, Optional ByVal execute As Boolean = True)
'#Zone " redimentionnement des tableaux (lors des nouveau reccordset non créé) "
Try
If UBound(drd1) < numero Then
ReDim Preserve drd1(numero)
ReDim Preserve nbFois(numero)
ReDim Preserve SelectRSTtemp(numero)
ReDim Preserve position(numero)
End If
Catch
ReDim drd1(numero)
ReDim nbFois(numero)
ReDim SelectRSTtemp(numero)
ReDim position(numero)
End Try
'#End Zone
'#Zone " Connection et initialisation à fermer "
If Not ouvert Then
connection()
drd1(numero) = New ADODB.Recordset
drd1(numero).ActiveConnection = OleDbConnection1
ouvert = True
Else
Try
drd1(numero).Close()
Catch
End Try
End If
'#End Zone
'#Zone " Zome mémoire pour connaitre la position "
position(numero) = 0
SelectRSTtemp(numero) = SelectRST
nbFois(numero) = True
'#End Zone
If LCase(Mid(SelectRST, 1, 6)) = "select" Then
'#Zone " Si la requête SQL est un Select "
Try
drd1(numero).Source = OleDbConnection1.Execute(SelectRST)
Catch
'#Zone " Risque d'erreur "
drd1(numero) = New ADODB.Recordset
drd1(numero).ActiveConnection = OleDbConnection1
Try
drd1(numero).Source = OleDbConnection1.Execute(SelectRST)
Catch
ErreurRéouverture()
End Try
'#End Zone
End Try
Try
drd1(numero).Open()
Catch
End Try
'#End Zone
ElseIf execute Then
'#Zone " Si la requête SQL est un exécute (delete, insert, ...) "
Try
OleDbConnection1.Execute(SelectRST)
Catch
ErreurRéouverture()
End Try
'#End Zone
End If
End Sub
#End Region 'Création du Reccordset
#Region "Une erreur majeur est survenu, redémarrer la conncetion"
Private Function ErreurRéouverture()
Dim i As Integer, j As Integer
Dim temp As Integer, temp2 As Boolean
ouvert = False 'base de donnée initialiser à fermer
'#Zone " fermer tout les reccordsets "
For j = 0 To UBound(drd1)
Try
drd1(j).Close()
Catch
End Try
Next j
'#End Zone
'#Zone " fermer la conection "
Try
OleDbConnection1.Close()
Catch
End Try
'#End Zone
'#Zone " ré-ouvrir les reccordsets et les positionner "
For j = 0 To UBound(drd1)
temp = position(j)
temp2 = nbFois(j)
ouvertureRST(SelectRSTtemp(j), j, False)
For i = 1 To temp
drd1(j).MoveNext()
Next i
position(j) = temp
nbFois(j) = temp2
Next j
'#End Zone
End Function
#End Region 'Une erreur majeur est survenu, redémarrer la conncetion
'ici c'est pour faire des boucle While
'while basedonne.read(1)
' 'évênement
'End While
#Region "Lecture du reccordset (moveNext) et validation s'il a toujours des reccords"
Public Function read(Optional ByVal numero As Integer = 0) As Boolean
Try
'#Zone " changer la position du reccorset "
If Not nbFois(numero) Then
'#Zone " pas la première fois, donc move next "
drd1(numero).MoveNext()
position(numero) += 1
'#End Zone
Else
'#Zone " première fois, donc reste à sa place "
nbFois(numero) = False
'#End Zone
End If
'#End Zone
'#Zone " validation s'il reste un reccord "
If drd1(numero).EOF Then
Return False
Else
Return True
End If
'#End Zone
Catch
Return False
End Try
End Function
#End Region 'Lecture du reccordset (moveNext) et validation s'il a toujours des reccords
#Region "positionner à la fin, puis retourne le nombre de reccord"
Public Function moveLast(Optional ByVal numero As Integer = 0) As Integer
Dim i As Integer = 0
While read(numero)
i += 1
End While
Return i
End Function
#End Region 'positionner à la fin, puis retourne le nombre de reccord
#Region "positionne au dernier reccord, mais sans le dépasser"
Public Function moveLastMoins1(Optional ByVal numero As Integer = 0) As Integer
Dim nb As Integer
Dim i As Integer
nb = moveLast(numero)
moveFirst(numero)
For i = 0 To nb - 2
drd1(numero).MoveNext()
Next i
position(numero) = i
End Function
#End Region 'positionne au dernier reccord, mais sans le dépasser
#Region "retourner au premier reccord"
Public Function moveFirst(Optional ByVal numero As Integer = 0)
ouvertureRST(SelectRSTtemp(numero), numero)
End Function
#End Region 'retourner au premier reccord
#Region "recevoir le valeur d'un item, mais grâce à sa position dans la requête (rapide)"
Public Function item(ByVal texte As Integer, Optional ByVal numero As Integer = 0) As Object
Return drd1(numero).Fields(texte).Value
End Function
#End Region 'recevoir le valeur d'un item, mais grâce à sa position dans la requête (rapide)
#Region "recevoir le valeur d'un item, mais grâce à son nom ou alias dans la requête (lent)"
Public Function item(ByVal texte As String, Optional ByVal numero As Integer = 0) As Object
Dim i As Integer
For i = 0 To drd1(numero).Fields.Count - 1
If LCase(drd1(numero).Fields(i).Name) = LCase(texte) Then
Return drd1(numero).Fields(i).Value
End If
Next i
End Function
#End Region 'recevoir le valeur d'un item, mais grâce à son nom ou alias dans la requête (lent)
'Toujorus fermer la base quand on s,en sert pus, ça évite les bugs
'En lpus, ça libère des ressources
#Region "Fermer la base de donnée"
Public Function Fermer()
Dim i As Integer
For i = 0 To UBound(drd1)
Try
drd1(i).Close()
Catch
End Try
Next i
Try
OleDbConnection1.Close()
Catch
End Try
ouvert = False
ReDim drd1(-1)
ReDim nbFois(-1)
ReDim SelectRSTtemp(-1)
ReDim position(-1)
End Function
#End Region 'Fermer la base de donnée
End Module
Conclusion :
comment l'utiliser, faite une module et copier le code
faite un 2e module avec les 4 constantes de connection (et toute les autre constante du programme
Module Constante
Public logon As String
Public pass As String
Public Const SystemData = "c:\windows\system.mdw"
Public Const baseDonnee = "Basedonne.mdb"
End Module
le path des base dedonnée et fichier system peuvent être absolu (C:\......) ou relatif (à partir du dossier de l'application)
une fois le login et le pass d'entré, reste plus qu'à faire basedonnee.ouvertureRST(SQL)
le champs numéro sert à avoir plusieurs reccordset en même temps.
le restant est pas mal commenter, mais n'hésiter pas a donner vos commentaires, amélioration, bugs
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.