[VB 2005] Utilisation de Base de donnée MySQL

Utilisation de Base de donnée MySQL [VB 2005] - VB/VBA/VBS - Programmation

Marsh Posté le 24-07-2007 à 11:23:13    

Bonjour !
 
Dans le cadre d'un stage il me faut developper une appliction permetant de piloter Excel (j'ai choisi VB pour utiliser l'interface COM d'Excel).
Je dois alimenter ce fichier Excel depuis une Base de donnée MySQL (dont je me sers aussi pour d'autres outils).
 
Mon probleme c'est que la MSDN ne donne aucune infos sur ça et mes recherches sur le net n'ont pas été trés fructueuses(quelques pistes sur ODBC ou l'API MySQL mais rien de trés précis).
 
Voilà je cherche donc un moyen de me connecter (en lecture seule suffira pas besoin d'écriture si ça facilite les choses) à ma base MySQL pas trop compliqué (si possible éviter d'avoir à instaler une librairie sur le poste devant utiliser l'application.
L'application sera instalée sur des postes personnels et la base sera sur un server local.
 
Je vous remercie d'avance pour votre aide (n'hésitez pas à me demander un complément d'informations).


Message édité par Moriar6 le 24-07-2007 à 11:55:38
Reply

Marsh Posté le 24-07-2007 à 11:23:13   

Reply

Marsh Posté le 24-07-2007 à 11:39:18    

tu souhaites du code ou des idées ?
 
dans le premier cas, que dalle,
dans le second, tu dois pouvoir approfondir en effet du cote d'ODBC et des topics a ce sujet existent deja il me semble dans HFR...

Reply

Marsh Posté le 24-07-2007 à 11:45:22    

Je cherche des idées et si vous avez des cours.
Le code je m'en charge ^^
 
Je ne sais pas ce qu'est l'ODBC et je navigue un peut dans le noir ,disons que je cherche un peut de lumiere :)


Message édité par Moriar6 le 24-07-2007 à 11:55:27
Reply

Marsh Posté le 24-07-2007 à 12:08:50    

Reply

Marsh Posté le 24-07-2007 à 14:06:23    

Sur ce lien ils utlisent ODBC avec DAO, mais je n'arrive pas à l'utiliser (visual studia ne reconnait pas les types Workspace).
Par contre j'arrive à utiliser avec ADO mais ça me renvoit une erreur au débogage :
 
[Microsoft][Gestionnaire de pilotes ODBC] SOurce de données inrouvable et nom de pilote non spécifié.
 
J'ai utilisé la syntaxe suivante :
 
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim sql As String
 
conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"_
                        & "SERVER=localhost;"_  
                        & " DATABASE=test_stage;"_
                        & "UID=root;PWD=; OPTION=3"
 
conn.Open()
 
rs = New ADODB.Recordset
rs.CursorLocation = ADOBD.CursorLocationEnum.adUseServer
rs.Open ("SELECT * FROM surf_recu", conn)
 
Debug.Print(rs.RecordCount)
 
rs.Close()
 
 
J'ai essayé de remplacer localhost par 127.0.0.1 mais c'est pareil.
Quand au nom de pilote je ne sais pas trop quoi faire. Faut il que j'instale un driver ?


Message édité par Moriar6 le 24-07-2007 à 14:11:48
Reply

Marsh Posté le 24-07-2007 à 14:10:31    

pour le DAO, as-tu bien ajouté la référence dans le projet ?

Reply

Marsh Posté le 24-07-2007 à 14:18:32    

J'ai ajouté une référence appelée adodb (c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll)
 
C'est la seule qui ressemblait à ce que je cherche.
 
D'ailleurs visual studio connait les types ADODB donc c'est bon signe de ce côté là non ?


Message édité par Moriar6 le 24-07-2007 à 14:22:52
Reply

Marsh Posté le 24-07-2007 à 15:02:35    

Une source ODBC s'appuie sur un driver.
Pour t'en convaincre il suffit d'aller dans le panneau de configuration, outils d'administration, sources ODBC et d'essayer d'en ajouter une : la première chose qu'il te demande à part le nom de la source, est le driver que tu veux utiliser.
Quand tu composes dynamiquement une chaîne de connexion, tu fais le boulot de l'interface d'administration ODBC ; tu dois fournir les mêmes informations et le driver doit être installé.

 

DAO est le modèle de base de données pour Access.
Le lien donné par jpcheck est un exemple d'utilisation de ce modèle pour accéder indirectement à ta base mysql.
En gros, au lieu de passer par ODBC directement, tu passes par Access (lui-même utilisant peut-être ODBC pour lire les données).
Bref on empile les couches.

 

Ne nous dispersons pas. Reste sur ton exemple avec l'objet ADODB et trouve le driver correspondant à ta déclaration si possible.


Message édité par tegu le 24-07-2007 à 15:03:14
Reply

Marsh Posté le 24-07-2007 à 15:09:04    

D'accord je te remercie beaucoup pour ces éclaircissement.
 
Je vais donc essayer d'instaler le driver "MySQL ODBC 3.51 Driver".
 
Si j'ai bien compris l'instalation se fait depuis panneau de configuration > outils d'administration > sources ODBC
 
Je vous tiens au courant :)

Reply

Marsh Posté le 24-07-2007 à 15:12:42    

Reply

Marsh Posté le 24-07-2007 à 15:12:42   

Reply

Marsh Posté le 24-07-2007 à 15:26:19    

L'installation du driver ne se fait pas forcément par l'interface du panneau de configuration ; souvent il s'agit d'un programme d'install identique à une application quelconque.
L'interface ODBC est utile pour créer des sources ODBC liées aux drivers installés sur ton PC.
Mais si tu utilises une chaine de connexion ADODB, il n'est pas nécessaire de créer la source ODBC (qui n'est que la version pérenne et statique de ta chaine de connexion programmée dynamiquement).
Par contre l'installation du driver reste de mise ; c'est le minimum pour expliquer à ton programme comment accéder aux données mySQL.


Message édité par tegu le 24-07-2007 à 15:26:43
Reply

Marsh Posté le 24-07-2007 à 15:29:50    

Merci bien tegu.
C'est vrai que je ne suis qu'en premier année d'informatique et je touche à pas mal de technologies qui me dépassent de loin donc de temps en temps quelques explications globales font vraiment du bien pour avancer.
 
 
Bon j'ai installé le driver et ça semble marcher (je n'ai pas encore vu ce que donnaient mes requetes mais en tout cas ça ne genre plus d'erreur).
 
Au cas ou quelqun ait le même probleme que moi j'ai trouvé le driver sur ce site http://dev.mysql.com/downloads/con [...] /3.51.html , c'est un simple .exe à installer.


Message édité par Moriar6 le 24-07-2007 à 15:36:29
Reply

Marsh Posté le 25-07-2007 à 15:35:24    

Bonjour !
Aprés avoir galeré pendant un petit moment je reviens aux nouvelles.
 
Voilà j'ai réussi à me connecter à la BDD (du moins je crois) mais je n'arrive pas à choper les données.
J'ai pas mal cherché sur le net mais je n'ai rien trouvé sur comment récuperer les données (ou alors des codes que je ne comprenais pas donc dans ces cas là mieux vaut eviter le C/C).
 
Voici ce que j'ai essayé (je me doute bien que ce n'est pas bon vu que le type de retour serait plutot un array mais je n'allais pas venir les main vides).
 
Dim my_connect As ADODB.Connection
        Dim my_record As ADODB.Recordset
 
 my_connect = New ADODB.Connection
        my_connect.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
                                    & "SERVER=localhost;" _
                                    & "DATABASE=test_stage;" _
                                    & "UID=root; PWD= ; OPTION=3"
 
        my_connect.Open()
 
        my_record = New ADODB.Recordset
 
        my_record.Open("SELECT * FROM surf_recu", my_connect, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)
 
        Do While Not my_record.EOF
 
            onglet.Cells(compteurt, "A" ) = my_record.Index
            compteurt = compteurt + 1
            my_record.MoveNext()
 
        Loop
 
N'hésitez pas à me demander le reste du code si vous en avez besoin (la partie de pilotage d'excel est bonne je l'ai déjà utilisée).
 
Je vous remercie d'avance.


Message édité par Moriar6 le 26-07-2007 à 14:23:15
Reply

Marsh Posté le 25-07-2007 à 17:29:29    

Tu as un message d'erreur ? L'exécution du code ne rentre pas dans ta boucle Do While ?
edit : j'avais mal regardé le contenu de ta boucle ; effectivement c'est à revoir. Je reposte bientôt.


Message édité par tegu le 25-07-2007 à 17:30:55
Reply

Marsh Posté le 25-07-2007 à 17:35:57    

Essaie d'utiliser la méthode .GetRows de ton objet Recordset pour mettre tes enregsitrements dans un tableau.
Ensuite utilise une astuce connue des codeurs VBA/Excel qui consiste à créer un objet Range liée à une plage de cellules et faire :

objRange.value = tableau()

Ça te colle toutes tes données dans la feuille Excel si les dimensions sont identiques.
Des exemples doivent foisonner sur ce forum.
J'ai pas trop de temps pour détailler, désolé.
 

Reply

Marsh Posté le 26-07-2007 à 14:08:05    

Bon ben voilà ce que j'ai obtenu (merci beaucoup pour la methode GetRows).
 
Pour ceux qui en auraient besoin la fonction prend en entrée le chemin vers le fichier excel ainsi que le nombre de champ de votre table.
Il faut juste changer la partie ConnexionString pour les login/mot de pass/nom de la BDD, ainsi que le nom de la table dans la requete.
 
Mon code est legerement différent car je ne souhaite pas faire un C/C de ma table sur un fichier excel mais sinon rien ne change (juste que je n'utilise qu'un seule for, ensuite mes colones sont choisies "en dur" ).
 
Voici le code :
 

Citation :

   Public Function AlimenterXLS(ByVal url_xls As String, ByVal nb_cols As Integer) As String
 
        Dim app_excel As New Microsoft.Office.Interop.Excel.Application
        Dim my_xls As Microsoft.Office.Interop.Excel.Workbook
        Dim onglet As Microsoft.Office.Interop.Excel.Worksheet
 
        Dim compteur_ligne As Integer
        Dim compteur_colone As Integer
        Dim nb_rows As Integer = 0
 
        Dim my_connect As New ADODB.Connection
        Dim my_record As New ADODB.Recordset
        Dim rs_array As Object
 
        my_xls = app_excel.Workbooks.Open(url_xls)
        onglet = NextOnglet(my_xls)  
 
        my_connect.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
                                    & "SERVER=localhost;" _
                                    & "DATABASE=test_stage;" _
                                    & "UID=root; PWD= ; OPTION=3"
 
        my_connect.Open()
 
        my_record.Open("SELECT * FROM surf_recu", my_connect, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)
 
        rs_array = my_record.GetRows
        nb_rows = UBound(rs_array, 2)
 
        For compteur_ligne = 1 To nb_rows
            For compteur_colone = 1 To nb_cols
                onglet.Cells(compteur_ligne, compteur_colone).value = rs_array(compteur_colone - 1, compteur_ligne - 1)
            Next
        Next
 
        my_record.Close()
        my_connect.Close()
        my_xls.Close()
        onglet = Nothing
        my_xls = Nothing
        app_excel = Nothing
 
 Return "Enregistrement réussi"
 
    End Function


Message édité par Moriar6 le 26-07-2007 à 14:28:39
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed