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

MFC Discussion :

[MFC] et connexion a une base MySql en C++


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut [MFC] et connexion a une base MySql en C++
    Bonjour,

    J'ai un ptit problème et je voudrais savoir si quelqu'un pourraît m'éclairer !

    Lors de l'ouverture de mon application MFC, je voudrais que une connexion à la base de données soit réalisé.

    Voici mes questions
    1° comment etre sur que une fois l'application, il n'y ait pas besoin de faire une demande de connexion lors des travaux sur la table

    2° Refermer la connexion lors de la fermeture de l'application. ( pour ca, je pense que c sur mon bouton "quitter" que je doit faire ...)

    Je vous remecie

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    rien compris a la question 1.
    la connexion tu la fermes quand tu veux par exemple dans ExitInstance (classe d'application).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    et bien en fait, je ne voit pas comment faire pour me connecter a la base lors de l'ouverture de l'appli et que la connexion reste pour que les differentes fonctions de mon appli puisse réaliser des requetes sur ma base sans avoir à ce reconnecter à chaque fois ...

    Si t'as un lien pour m'expliquer sa ... parce que la, mon script ne se connecte meme po !

  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    C'est une très chouette question.

    Le problème qu'on rencontre souvent est que l'on gère mal une connexion à une base de données. Il y a de ces gens qui sans le savoir ouvre plus d'une dizaine de fois des connexions à leur bd lorsqu'il clique sur des boutons de leurs interfaces. Ne parlons même des appli web. La connexion à la base est réouverte à chaque chargement de la page. Ce qui est grave.
    Lorsque la connexion est ouverte elle doit être précieusement garder et même, elle doit être mise en cache si possible. Avec un développement sous OLE DB, ATL fournit la classe CDataSourceCache dont l'instance de cette classe doit demeurer dans un objet dont sa durée de vie est égale à celle de l'application et particulièrement dans la classe de module pour une dll ATL.
    S'il l'on utilise ODBC avec les MFC. Je personnalise ma classe CDatabase et je le sauvegarde dans l'objet l'application.

    Il est préférable d'ouvrir la connexion le plutôt possible une et une seule fois dans toute l'application dans le InitInstance de l'objet application.
    Et il faut fermer la connexion le plutard possible dans Existance de l'objet application

    Si un recordset qui à besoin de la connexion à ma bd
    je fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CRecordset rs;
    rs.m_pDatabase = &myOnlyOneConnectedDatabase;
    // ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    oula, jai pas tout compris mais bon, c'est possible si je met mon script au dans le InitInstance alors ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    voici le code que j'utilise pour me connectere, por, il ne fonctionne po et la, je comprend pas pourquoi, tout me semble normal !

    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
    38
    39
     
    #include <mysql.h> 
    #include <iostream>
    #define MYSQL_DB "aquarium"
     
    #pragma comment(lib, "libmysql.lib") // libmysql.dll doit etre dans le meme rep.
    using namespace std;
    int main(void)
    {
     MYSQL mysql;
     const char *host  = "127.0.0.1"; // Adresse du serveur MySQL
     const char *user  = "Nelmo"; // Nom d'utilisateur
     const char *pass  = "matrix"; // Mot de passe
     const char *db    = "aquarium"; // Base de donnée
     
     //MYSQL_RES *result;
     
     system("cls");
     
     mysql_init(&mysql);
     //mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"main");
     if (!mysql_real_connect(&mysql,host,user,pass,db,3306,NULL,0)) //connexion
      {
       cout<<"connexion Failed";
       return (0);
            }
            else
      {
       cout<<"connexion reussi";
      }
     
      /*(mysql_select_db(&mysql,MYSQL_DB)) 
      {
                    mysql_close(&mysql);
        system("pause");
            }*/
            mysql_close(&mysql);
      return 0;
    }
    Voila, jespere que vous pourrez m'aider, je suis en train de me ronger la tete ... hihihihi

  7. #7
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut
    salut

    utilise ADOLib.h c'est une librairie qui regroupe toute les classes premettant
    la connexion et la création de requete SQL, de plus elle est tres simple d'utilisation.


    et pour pouvoir te connecter au démarrage de ton application met ton code
    dans la methode OnInitDialog() mais n'oublie pas de fermer ta connexion lors de la fermeture de ton appli

    voila et bon TAF

  8. #8
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut
    et si je dit pas de bétise y me semble que Mysql.h est une librairie pour du C
    et non du C++

    enfin sui pas sur à confirmer par quelqu'un d'autres

  9. #9
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Mais ton appli, n'est pas de l' MFC!!!

    Pour ce qui est de MySql, ou pour tout autre SGBD, il serait mieux de trouver un pilote ODBC pour MySQL je crois MyOdbc, ensuite tu enregistres ta source de données auprès de l'administrateur ODBC.

    L'intérêt d'utiliser les classes de ODBC (CDatabase, CRecordset, etc) moyennant un pilote d'accès à ta base de données est que tu réalises une programmation homogène sans trop t'intéressé aux API spécifiques à tel ou tel SGBD. Au lieu d'utiliser directement les api : mysql_init(), mysql_options(), mysql_real_connect(), etc Tu te sert uniquement des méthodes des classes fournit par ODBC et ce dernier se charge de dialoguer avec le pilote ODBC pour invoquer l'api MySQL adéquate.

    De cette façon, tu peux rendre ton code réutilisable, et appliquer ton même code de connexion pour un autre SGBD tel que SQL Server. Et au mieux tu empaquêtes tes CDatabase et CRecordset dans une dll MFC d'extension séparée du code principale de ton appli.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    Je vous remercie pour tout vos conseils !

    Donc si je t'ais bien compris Gabrielly, les commandes MySQL seront devenu transparentes pour moi ? je ne "pisserait" que de l'ODBC ?


    Je vais également me renseigner sur ADOlib .. mais bon, je doit me mettre d'accord aujourdui, le temps presse

    En tout cas, je vous remercie

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    Bien, j'ai installé le connector ODBC pour MySql 5.0.

    Concraitement, que va engendrer cette installation ?

    Je ne comprend pas trop, vais-je programmer en ODBC ?

    Merci

  12. #12
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Donc si je t'ais bien compris Gabrielly, les commandes MySQL seront devenu transparentes pour moi ? je ne "pisserait" que de l'ODBC ?
    C'est exacte, que ça soit ODBC, OLE DB, ADO ou ADO .NET, le but fixé est la transparence visa vis des divers SGBD. Quand bien même ces technos fournissent des classes différentes CDatabase pour ODBC, CDataConnection pour OLE DB, SqlConnection pour ADO .NET ne représentent au fait qu'un même concept de connection à une base de données.

    Une fois que ton pilote ODBC est installé. Tu vas sur l'administrateur des sources de données ODBC et tu sélectionnes ton pilote en indiquant un nom pour ta source (DSN), un utilisateur et mot de passe probablement.
    Tu créés ta base de données (tables, vues, procédures stockées etc) sous MysSQL.

    Et à l'aide des assistants de VC++ tu génères des classes ODBC pour te connecter et faire des requêtes sur tes tables.

    Je ne comprend pas trop, vais-je programmer en ODBC ?
    Tu as le choix chaque techno à ses plus et ses moins.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    je vous remercie pour vos réactions

    Je ne met pas le tag résolus, parce qui si jamais j'ai pas réussi, sa m'embetterai de recreer un nouveau poste lol

    En tout cas, merci

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    bon, jn'"ayant encore pas tout saisie sur ADO et ODBC, j'ai continué un peu a me dépatouiller avec ma fonction mysql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Linking...
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_fetch_row@4">_mysql_fetch_row@4</a>
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_use_result@4">_mysql_use_result@4</a>
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_query@8">_mysql_query@8</a>
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_close@4">_mysql_close@4</a>
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_select_db@8">_mysql_select_db@8</a>
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_real_connect@32">_mysql_real_connect@32</a>
    connection.obj : error LNK2001: unresolved external symbol <a href="mailto:_mysql_init@4">_mysql_init@4</a>
    Debug/connection.exe : fatal error LNK1120: 7 unresolved externals
    Error executing link.exe.
    J'utilise la librairie mysql.h au lieu de mysql++ car sinon, j'ai 21 erreurs lors de la compile ...

    Il ùe semble avoir deja vu ce probleme, mais j'ai pas retrouvé le topic ...

    voici le code que j'ai
    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
     
    #include "stdafx.h"
    #include <iostream>
    #include <mysql.h>
    //#include <mysql++>
    #define MYSQL_HOST "localhost"
    #define MYSQL_DB "aquarium"
    #define MYSQL_LOGIN "Nelmo"
    #define MYSQL_PASSWD "matrix"
    int main (int argc, char * const argv[]) {
        MYSQL *mysql;
        MYSQL_RES *result;
        MYSQL_ROW row;
     
     
        if((mysql = mysql_init(NULL))==NULL){
            return -1;
        }
        if (!mysql_real_connect(mysql,MYSQL_HOST,MYSQL_LOGIN,MYSQL_PASSWD,NULL,3306,NULL,0)) {
            return -1;
        }
        if (mysql_select_db(mysql,MYSQL_DB)) {
            mysql_close(mysql);
            return -1;
        }
        mysql_query(mysql,"SELECT * FROM t_module");
        result = mysql_use_result(mysql);
        while((row = mysql_fetch_row(result))) {
            printf("%s",row[1]);
            fflush(stdout);
        }
        mysql_close(mysql);
        std::cout << "Hello, World!\n";
        return 0;
    J'avoue que la, j'en ai plus que marre, j'y met du mien, mais je n'arrive pas a comprendre

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur connexion a une base mysql
    Par klemellill dans le forum JBuilder
    Réponses: 9
    Dernier message: 03/05/2007, 16h45
  2. connexion a une base mysql : accessed denied
    Par ghita269 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 17/09/2006, 11h01
  3. problème de connexion sur une base mysql
    Par boss_gama dans le forum Installation
    Réponses: 4
    Dernier message: 05/09/2006, 14h13
  4. Voir le nombre de connexion d'une base MYSQL ?
    Par zmania69 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 31/08/2006, 18h22
  5. Connexion sur une base Mysql distante (non locale)
    Par externa dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/02/2006, 11h34

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