Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONNECTION BASE DONNÉE JET OLEDB 4.0 EN VISUAL BASIC .NET


Information sur la source

Catégorie :Base de Donnees Source .NET ( DotNet ) Niveau : Initié Date de création : 18/08/2004 Date de mise à jour : 18/08/2004 19:43:54 Vu / téléchargé: 10 510 / 1 225

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

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

  • '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
'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
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

18 août 2004 19:25:34 :
ajout d,une source test
18 août 2004 19:43:55 :
pour voir les commentaire de mon gestionnaire de donner dans une base de donnée, mais sans ouvrir Access avec une protection au maximum voir ici http://www.vbfrance.com/code.aspx?ID=25509

Commentaires et avis

signaler à un administrateur
Commentaire de gwiwi le 18/08/2004 15:54:58

Super code, bravo.

Seul petit bémol, Microsoft deconseille sous .net d'utiliser les modules.

signaler à un administrateur
Commentaire de dragon le 18/08/2004 16:05:37

on fait tu toujours ce que Bilou dit lol
ça marche à la perfection, en tout cas ça plante pas chez moi et je fais des milier de requête sans fermer la base

juste un Bug, faut que la requête soit bonne, si on fait une erreur en l'écrivant, le programme essai de l'ouvrir, est pas capapble, faque il pense que c,est un problème de connection, faque il fini par faire une boucle infini. Mais si toute les requêtes sont bonne, ça arrive pas.

signaler à un administrateur
Commentaire de tmcuh le 18/08/2004 18:20:28

Superbe, sans meme l'essayé je mets 10/10 car microsoft nous consoit un nouveaux langages, sencé remplacer l'ancien seulement le nouveaux n'as pas de gestion assez complète de la base de donnée à mon sens. Tu as fait un remarquable boulot j'ai zieuté comme cà, propre, commenté, tabulé, nikel... cà me servira en tt cas...
PS : un ptit zip serais pas de refus car je pense que ta source va faire le tour du site ;)

signaler à un administrateur
Commentaire de dragon le 18/08/2004 19:44:39

c'est ajouter la source

signaler à un administrateur
Commentaire de zeunz le 09/09/2004 20:18:37

slt,
serait il possible d'ecrire le debut d'un source sur l'ouverture d'une base de données access 97 ou 2000 avec un mot de passe stp (en vb6)
en fait c'est l'ouverture AVEC un password ki me chagrine...

merci.

signaler à un administrateur
Commentaire de dragon le 09/09/2004 20:39:52

un peu long tout refaire en VB6.0

cherche un peu, il y en a déjà pas mal de source pour se connecter à une base de donnée, mais en VB6.0

pour ce qui est du login et pass, regarde comme il faut, ils sont là, faut les intégré dans le string de connection

signaler à un administrateur
Commentaire de zeunz le 10/09/2004 18:44:20

ok je vais voir tt ca. c'est simplement pr ouvrir la base Avec le password. je sais comment faire ss mot de passe ms avec, je bloke un peu...
merci.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS