IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[]Abstraction base de donnee grace a une classe


Sujet :

VB 6 et antérieur

  1. #1
    tfh
    tfh est déconnecté
    Nouveau Candidat au Club
    Inscrit en
    Juin 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut []Abstraction base de donnee grace a une classe
    Bonjour,

    J'aimerais savoir si l'un d'entre vous a deja developpe une classe permettant de gerer de facon transparente l'acces a une base de donnee. GEnre on lui file une connection string et apres y'a deux methodes :
    Execute( sql As String)
    getRS(sql As String) As ADODB.REcordset.


    Enfin c'est un exemple. Je suis nouveau en VBA, mais en general ce genre de classe a deja ete faite et refaites maintes fois, donc bon si qqun a deja developpe ce genre d'objet et serais pret a le partager merci d'avance

  2. #2
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Hello!
    J'ai fait ce truc tout simple pour accéder à une base Access protégée par mot de passe. Mais bon, ce n'est pas optimisé, puisqu'il crée une connexion à chaque requête, donc c'est lent dès qu'il faut en enchaîner beaucoup.
    Mais ça marche bien, et il n'y a qu'une seule méthode. Pour les 'Execute', tu récupères un ResultSet vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Function ConnexionBase() As ADODB.Connection
     
        'Déclaration de la variable de connexion
        'Dim cnx As ADODB.Connection
     
        Set ConnexionBase = New ADODB.Connection
     
        'Définition du pilote de connexion
        ConnexionBase.Provider = "Microsoft.Jet.Oledb.4.0"
     
        'Définition de la chaîne de connexion : chemin complet du .mdb
        ConnectStr = "Z:\MonRepertoire\Base_pwd.mdb"
        ConnexionBase.ConnectionString = ConnectStr
     
        MotDePasse = "CDP"
     
        'Ouverture de la base de données
        ConnexionBase.Open "Data Source=" & ConnectStr & _
            ";Jet OLEDB:Database Password= " & MotDePasse & ";"
     
    End Function
     
    Function MakeRequete(Requete As String) As ADODB.Recordset
     
        'WorkSheets("Emissions").Cells(10, 10).Value = Requete
        'MsgBox ("Pause")
     
        Dim cnx As ADODB.Connection
     
        Set cnx = ConnexionBase()
        Set MakeRequete = New ADODB.Recordset
     
        'Exécution de la requête
        MakeRequete.Open Requete, cnx
     
    End Function
    Mais tu peux adapter ça pour conserver qu'une seule connexion tout le long de ton traitement, et gérer un peu mieux les paramètres d'ouverture de cette connexion.

  3. #3
    tfh
    tfh est déconnecté
    Nouveau Candidat au Club
    Inscrit en
    Juin 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En fait a l'instant j'utilise deux lazy singleton pour n'avoir qu'une connection et qu'une seule requete que je reutilise. Mais de facon etrange, ma base de donnees Access est en train d'exploser en taille.

    Si quelqu'un voi un probleme ( un objet ou une connec non fermee)

    Donc voila les lazy singleton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Private dbInstance As Database
    Private queryInstance As QueryDef
     
    Function myQuery() As QueryDef
     
     
     
       If queryInstance Is Nothing Then
     
            Set queryInstance = myDB.QueryDefs("TempQuery")
     
        End If
        Set myQuery = queryInstance
    End Function
     
     
     
    Function myDB(Optional DBPath As String) As Database
     
     
     
       If dbInstance Is Nothing Then
     
            Set dbInstance = OpenDatabase(paramSheet.Range("DB_PATH").Value)
     
        End If
        Set myDB = dbInstance
    End Function
    Ensuite quand je veux executer une requete sql je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    myQuery.SQL = "INSERT blablabla"
    myQuery.Execute
    myQuery.Close
    et pour recuperer un recordset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    myQuery.SQL = osql.SQL
           Set rs = myQuery.OpenRecordset
    myQuery.Close
     
    'Mumuse avec mon recordset


    Et en faisant de cette facon , apres deux jours sans ajout de donnees ( juste des SELECT pas d'insert ou update), ma base de donnees est passe de 5Mb a 600Mb. Donc il y'a un probleme certain, je me demande ce qui est stocke en plus dedans ( des requetes ? des recordsets ? )

    Si quelqu'un a une idee je suis rpeneur

  4. #4
    tfh
    tfh est déconnecté
    Nouveau Candidat au Club
    Inscrit en
    Juin 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bon en fiat je vais me codercette calsse. Ca ne me pose pas de probleme, juste je ne suis pas au courant des meilleures pratiques pour acceder a une DB en vba. Y'a t il un cours ou livre resumant bien tout ce qu'il faut ouvrir et fermer (les connections les query, les recordsets) et la meilleure facon de le faire pour ne pas degrader les performances ?

    Par exemple vaut il mieux utiliser des objets ADODB ou bien des objets issus de la libraire DAO ?

    Merci d'avance

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2013, 03h22
  2. base de donnees vers diagramme de classe uml
    Par laurent2403 dans le forum UML
    Réponses: 1
    Dernier message: 09/04/2013, 17h53
  3. Accéder a une base de donnee oracle via une url?
    Par Chikatilo dans le forum Interfaces de programmation
    Réponses: 10
    Dernier message: 22/05/2008, 16h56
  4. manipulation de donnees membres dans une classe
    Par gfranck dans le forum C++
    Réponses: 3
    Dernier message: 14/11/2006, 10h55
  5. [vb6] alimentation d'un champs text grace a une base de donnee
    Par lumbroso dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 18/08/2006, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo