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 :

[ODBC][Débutant] Database::Open()


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut [ODBC][Débutant] Database::Open()
    Bonjour,

    Je suis sous VS 2003, je viens de créer un projet ODBC.....
    J'eesaie de bidouiller un peu la base mais impossible de la changer avec Edit() et Update()....
    A chaque appel le débugger Windows intervien....

    Si vous voulez un bout de code, dites-le....

    Merci d'avance

    Cheper

  2. #2
    Membre expérimenté
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Par défaut
    Commences par nous envoyer le bout de code.

    Merci

  3. #3
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Bonsoir,

    Les jeux d'enregistrements...


  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Bonjour,

    Gabrielly, je viens de lire ton tutoriel.....
    Tout d'abord, bravo, c'est très bien expiqué !
    J'ai crée un autre projet MFC, attaché automatiquement à une base de données avec VS .NET 2003.
    J'ouvre la table avec comme type CRecordset::dynaset, mais quand j'éxecute mon appli l'erreur suivante est emise :
    Le gestionnaire ODBC ne prend pas en charge les feuilles de réponses dynamiques
    Si je l'ouvre avec snapshot, le message n'est pas affiché mais je peux pas me balader dans mon jeu d'enregistrement.....un autre message s'affiche :
    No cursor name available
    Je vois pas trop comment y remédier.

    Merci d'avance.

    PS : Si vous voulez un bout de code demandez, mais préciser quel bout.... (TestBaseView.h et .cpp, TestBaseDoc.h et .cpp, TestBaseSet.h et .cpp)

  5. #5
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Salut,

    Comment crées-tu ton projet?
    Si tu utilises un fichier .mdb est-il en lecture seule?
    Lorsque que tu crées ton projet, le choix du type du recordset se fait en cochant les options de l'assitant AppWizard (VC++ 6.0).

    Montre moi le code où tu tentes de te connecter à la base.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Le classwizard c'est mal
    Bonjour à tous,

    Si vous voulez mon avis, je n'utiliserais pas d'assistant et j'utiliserais simplement les méthodes fournis par les objets CRecordset et CDatabase.

    Pour faire des modifications dans la base de donnée, il vous suffit d'utiliser l'objet CDatabase et sa méthode executeSQL et lui passer la requète SQL sous format de chaine de charactère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CString strCmd = "UPDATE Taxes SET Federal = 36%";
    CDatabase db;
    db.open("DSN=DATA_SOURCE");
    TRY
    { db.ExecuteSQL( strCmd ); }
    CATCH(CDBException e)
    { // The error code is in e->m_nRetCode }
    Pour rechercher un enregistrement ou se promener dans des enregistrements il suffit d'utiliser un objet CRecordset et c'est méthodes comme IsBOF, IsEOF, MoveNext, MovePrev, MoveLast et MoveFirst. Il y a beaucoup d'autre méthode utile dans la classe CRecordset.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CDatabase db;
    db.open("DSN=DATA_SOURCE");
    CRecordset rs(db);
    rs.Open(CRecordset::dynamic,"select * from TABLE");
    while (!rs.IsBOF() && !rs.IsEOF())
    {
       //see the data and manipulate them
       rs.MoveNext();
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Salut,

    Gabrielly, je crée mon projet sous VS .NET 2003. Je fais Fichier->Nouveau Projet->'Type de projet=Projets Visual C++'->'MFC'->'Modéle=Applications MFC', puis OK.
    Après une autre boîte de dialogue s'ouvre :
    Dans l'onglet Type d'application je coche 'SDI'
    Dans l'onglet Prise en charge des documents composés je coche 'Serveur complet'
    Dans l'onglet Prise en charge des bases de données je coche 'Vue avec prise en charge des fichiers' puis 'ODBC'.....et ici je choisi snapshot ou dynaset.
    Et dans le meme onglet j'appui sur le bouton source de données et je choisi ma base de données (de type MySQL).

    Cheper

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Salut Philippe299,

    J'essai avec ta methode, j'ai cherché dans la MSDN les fonctions que tu m'a cnseillées...
    Je n'arrive pas à utiliser la fonction CDatabase::Open()...
    Voila comment je me connectais à ma base avec VS .NET 2003 automatiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CString CTestBaseSet::GetDefaultConnect()
    {
    	return _T("DSN=sudev_pira;DATABASE=pira;SERVER=10.0.0.120;UID=root;PWD=zeitoon;PORT=;OPTION=8;STMT=;");
    }
     
    CString CTestBaseSet::GetDefaultSQL()
    {
    	return _T("[s_achadrlivcmde]");
    }
    Sais-tu comment convertir cela pour utiliser Open() ou OpenEx() ?

    Merci d'avance.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Connection String
    Comme tu peux le voir dans ta méthode GetDefaultConnect() tu as la chaine de connection à la BD qui est "DSN=sudev_pira;DATABASE=pira;SERVER=10.0.0.120;UID=root;PWD=zeitoon;PORT=;OPTION=8;STMT=;", la source de donnée est ce qui est après le égal à l'identifiant DSN. En général lorsque l'on crée une source de donnée ODBC c'est pour une seule base de donnée. Si ta base de donnée est protégé tu dois ajouter les identifiants comme UID(Nom d'utilisateur) et PWD(mot de passe). Par contre, si ta base de donné est situé sur une autre machine alors tu as besoin d'ajouter à ta chaine de connection l'IP de la machine et aussi le nom de la base de donnée.
    En résumer ta chaine ressemblerais à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CDatabase db;
    db.OpenEx("DSN=sudev_pira;DATABASE=pira;SERVER=10.0.0.120;UID=root;PWD=zeitoon;PORT=;OPTION=8;STMT=;");
    Alors bien réécris moi si tu as besoin d'aide.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Salut,

    J'ai fait ce que tu m'as dit de faire mais il y a toujours un rapport d'erreur de Windows qui s'ouvre et quand je lance le debugger il me dit que l'erreur est provoquée par l'appel de la fonction OpenEx().....
    Voici mon appel que j'ai changé car la base de données est située sur mon poste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dB->OpenEx("DSN=sudev_pira;UID=root;PWD=zeitoon;PORT=;OPTION=8;STMT=;");
    et si j'enléve aussi PORT=;OPTION=8;STMT=; -> rapport de Windows....
    J'ai revérifié si la base était en lecture seule mais non elle ne l'est pas.
    En fait ce que je ne comprends pas c'est :
    Pourquoi Windows m'affiche un rapport d'erreur et pas le compilo ??

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Erreur de Window/Application
    Bien moi quand j'utilise la fonction OpenEx je n'ai pas de BD sécurisé par mot de passe et nom d'utilisateur. Alors je fais simplement quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CDatabase db;
    if (!db.OpenEx("DSN=BDExperience",CDatabase::openReadOnly)) cout << "Ne peu ce connecter a la BD" << endl;
    Ici ma BD est ouverte en mode de lecture seulement. Puis si je veux avoir un CRecordset je fais simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CRecordset rs(&db);	 
    CString sql = "select * from Experience";
    rs.m_strFilter = "numExperience='"+numExperience+"'";
    if (!rs.Open(CRecordset::dynaset,sql)) cout << "N'a pas plus executer la commande SQL" << endl;
    Alors bien, j'imagine que si window te fait du trouble c'est probablement c'est à cause d'un mots de passe erroné ou ton application n'a pas les droits pour accèder à la source de donnée. Mais bon, ton application passe par un Driver ODBC pour accèder a la BD, alors s'il y a un erreur, c'est Window qui affiche l'erreur et pas ton application.

    Juste comme ça tu as créé une source de donné ODBC sur le poste: start>setting>control panel>administrative tool>Data source. Il faut te créer une source de donnée ODBC avec les outil d'administration de Windows.

  12. #12
    mat.M
    Invité(e)
    Par défaut Re: [ODBC][Débutant] Edit() et Update()
    Citation Envoyé par lastcheper
    Bonjour,


    A chaque appel le débugger Windows intervien....


    Cheper
    le debugger intervient c'est pas assez précis.
    Il faut gérer les exceptions avec Try et Catch comme dans le code de Philippe de Montréal

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Salut,

    J'ai essayé de gérer les exceptions mais le compilo me sort une erreur.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try {dB->OpenEx("DSN=sudev_pira;DATABASE=pira;UID=root;PWD=zeitoon;PORT=;OPTION=8;STMT=;");}
    catch (CDBException e) {
    	Trace << e.m_nRetCode << "\t" << e.m_strError << endl;
    }
    Et voici l'erreur :
    error C2316: 'CDBException' : ne peut pas être intercepté en tant que destructeur et/ou le constructeur de copie est inaccessible
    Je n'utilise pas souvent de try/catch, je vois pas a quoi elle correspond....

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Je viens de télécharger MyODBC-3.51.11-2 j'avais la version 2.50.39.....
    Je me suis dit que c'étais ça mais non, pas du tout....
    Ca marche toujours pas.....
    Dans Panneau de config->Outils d'administration->Sources de données ODBC->Sources de données utilisateur
    j'ai créé une nouvelle source de données avec la nouvelle version de MyODBC que j'ai attachée à la base que j'utilise dans mon appli...
    La dedans j'ai coché : Enable dynamic cursor mais là non plus ca change rien....
    Existe-t-il un flag pour que mon aplli puisse toucher à ma base (créer, supprimer, modifier) avec le mode dynaset???

    Je sais plus trop quoi faire !!

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    S'il vous plait...........Aidez-moi !!!

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Bonjour,

    Quand j'essaie de me connecté grâce à db->OpenEx(...), je suis dans un projet basé dialogue......
    Croyez-vous que ce soit à cause da ça qu'il apparait un rapport d'erreur ????
    Peut-être faut-il que je crée une appli SDI ou MDI sans la lier automatiquement, avec VS .NET 2003, à une base de données.

    Philippe299 quand tu utilise tes fonction tu est dans un projet ?? Si oui, lequel ??

    Merci d'avance ......

  17. #17
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    personnelement, j'arrive a me connecter dans un projet MFC boite de dialogue avec la fonction OpenEx
    je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	CString sConnect = "Driver={SQL Server};Server=NomServeur; Trusted_Connection=no;UID=;PWD=;Database=NomBDD"; //a changer en fonction des parametres
     
    	if( !db.OpenEx(sConnect, CDatabase::noOdbcDialog|CDatabase::useCursorLib))
    	{ 
    		AfxMessageBox("Impossible d'ouvrir la base de donnée en lecture seule"); 
    		return; 
    	} 
    	else 
    	{ 
    		AfxMessageBox("Test d'ouverture réussi");
    et ca marche tres bien

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Ca marche............
    C'est incroyable.
    J'ai compris pourquoi : en fait j'utilisait un pointeur sur CDatabase, et quand j'ai enlevé '*' ca a marché.....
    Je ne vois pas pourquoi, mais la je crois que je ne vai pas chercher.

    Merci lenouvo, Merci

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

Discussions similaires

  1. Connexion à une bdd (odbc) (débutant)
    Par majong dans le forum C++
    Réponses: 0
    Dernier message: 17/02/2008, 19h46
  2. Réponses: 3
    Dernier message: 20/06/2007, 14h31
  3. [MFC][ODBC][Débutant] CRecordView constructor
    Par lastcheper dans le forum MFC
    Réponses: 18
    Dernier message: 18/08/2005, 10h54
  4. tutoriel : Database.Open-Could not use, file already in use
    Par MARTIN Gérard dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/05/2005, 11h56
  5. DRIVER ODBC INTERBASE 6 OPEN SOURCE
    Par CYRILLUS dans le forum InterBase
    Réponses: 1
    Dernier message: 10/01/2005, 13h56

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