Connection base donnée jet oledb 4.0 en visual basic .net

Description

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

Codes Sources

A voir également

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.