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 :

Utilisation de CDatabase pour modifier une base de données O


Sujet :

MFC

  1. #1
    jyg
    jyg est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Utilisation de CDatabase pour modifier une base de données O
    J'utilise le code suivant pour essayer d'accèder à une base de donnèes.

    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 "afxdb.h"
     
    class CRec : public CRecordset
    {
    public :
    	CRec (CDatabase*);
    	CString m_prod;
    	virtual void DoFieldExchange (CFieldExchange *pFX);
    };
     
    void main ()
    {
    int rc;
    CDatabase db;
    rc=db.OpenEx ("DRIVER=SQL Server;SERVER=NOM_ORDINATEUR;UID=sa;PWD=interstiss",0);
    printf ("OpenEx=%x\n",rc);
    CRec rec (&db);
    printf ("rec=%x\n",rec);
    rc=rec.Open (CRecordset::dynaset,"select * from [T Assemlages]",CRecordset::none);
    printf ("Open=%x\n",rc);
    rec.MoveFirst ();
    rc=rec.CanUpdate ();
    printf ("prod=%s\n",rec.m_prod);
    printf ("CanUpdate=%x\n",rc);
    rec.Edit ();
    rec.Close ();
    db.Close ();
    }
     
    CRec::CRec (CDatabase *db)
    	 :CRecordset (db)
    {
    }
    void CRec::DoFieldExchange (CFieldExchange *pFX)
    {
    CRecordset::DoFieldExchange (pFX);
    pFX->SetFieldType (CFieldExchange::outputColumn);
    RFX_Text (pFX,"Num produit",m_prod);
    }
    L'éxécution donne le résultat suivant
    OpenEx=1
    rec=5530d0
    Open=1
    prod=
    CanUpdate=1

    puis le programme se plante lors de l'execution de la méthode Edit
    dans dbcore.cpp ligne 1622 sur une instruction ASSERT (m_nFields!=0)
    en effet la valeur est n_mFields est 0.

  2. #2
    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
    Pourquoi tu ne demandes pas à visual studio de te générer directement un projet où tu accèdes à une base de données.

  3. #3
    jyg
    jyg est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Parceque je dois insérer cet accès dans une application éxistante écrite sans les Wizards et d'autre part je préfère comprendre ce que je fais.

  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
    Tu ne fais pas de Update()

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Fais Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rc=rec.Open (CRecordset::dynamic, _T("select * from [T Assemlages]"),CRecordset::none);
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rc=rec.Open (CRecordset::dynaset,"select * from [T Assemlages]",CRecordset::none);
    A++

  6. #6
    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
    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
     
    if( !rec.Open (CRecordset::dynaset,"select * from [T Assemlages]",CRecordset::none) )
    {
           cerr << "Impossible d'ouvrir" << endl;
           return -1;
    }
     
    if( !rec.CanUpdate () )
    {
           cerr << "Impossible de mettre à jour ma table" << endl;
           return -1;
    } 
     
    rec.Edit ();   // prépare le tampon d'édition
    rec.m_prod = "eVC++ product";  // j'édite
    if( rec.Update() ) // je met à jours
    {
            cout << "Mise à jour réussie" << endl;
    }
    else
    {
            cerr << "eurrrr!!!!!!" << endl;
            return -1;
    }
     
    rec.Close (); // je libère l'infrastructure en terme de mémoire
    db.Close (); // je ferme la connexion à masource de données
    Gabrielly

  7. #7
    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
    Va aussi dans le constructeur et place m_nFields à 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CRec::CRec (CDatabase *db) 
        :CRecordset (db) 
    { 
          m_nFields = 1;  // ton recordset n'utilise qu'un champ m_prod
    }
    Gabrielly

  8. #8
    jyg
    jyg est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J'ai rajouté
    dans le constructeur de CRec, maintenant je récupère le code du premier produit et la méthode Edit ne plante plus. Bien sur il reste la mise à jour de l'enregistrement puis l'appel d'Update pour mettre à jour la base.
    Merci à tous pour vos conseils et j'espère parvenir à terminer ce code sans faire appel à vos services.

  9. #9
    jyg
    jyg est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [Résolu]
    J'ai rajouté les appels à AddNew et Update, ça marche.
    Par contre pour l'état [Résolu] je l'ai mis dans le titre, je n'ai pas trouvé le bouton en bas à gauche de la page (voir le tutorial).
    Merci à tous, A+

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2015, 16h25
  2. Utilisation de taleaux pour faire une base de données
    Par zaloeil dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/06/2014, 14h44
  3. utilisation ADO pour créer une Base de Donnée vide
    Par laribi71 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 20/02/2008, 19h13
  4. Réponses: 3
    Dernier message: 18/01/2008, 20h45
  5. Réponses: 12
    Dernier message: 05/03/2007, 10h36

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