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 :

[CDatabase\CRecordset] Erreur : "Invalid column number"


Sujet :

MFC

  1. #1
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut [CDatabase\CRecordset] Erreur : "Invalid column number"
    Bonjour à tous,
    Voici mon code :
    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
            //Déclarations
    	CDatabase spDatabase;
    	CString sTest;
    	CDBVariant VariantValue;
    
    	//Ouverture de la base
    	spDatabase.Open(_T("csPOffice"),false,false,_T("ODBC;"));
    	if(!(spDatabase.IsOpen()))
    		AfxMessageBox(_T("Echec de connexion..."));
    
    	//Construction du Record Set à partit de la base
            RecordSetContact spRecordSetContact(&spDatabase);
    
    	//Ouverture du Record Set
    	spRecordSetContact.Open();
    	if(!(spRecordSetContact.IsOpen()))
    		AfxMessageBox(_T("Echec de connexion..."));
    	
    	short nFields = spRecordSetContact.GetODBCFieldCount();
    
    	while (!spRecordSetContact.IsEOF())
    	{
    		for( short index = 0; index < nFields; index++)
    		{
    		      spRecordSetContact.GetFieldValue(index, VariantValue);
    		}
    		spRecordSetContact.MoveNext();
    	}
    La ligne en rouge me génère l'erreur (à l'exec) "Invalid column number".
    Je travail avec une base Pervasive.

    Si quelqu'un a une idée et pourrait m'expliquer ce qui ne lui va pas ?...

  2. #2
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    salut,

    qu'est ce que te renvoies la fonction GetODBCFieldCount() ? est-ce que ça colle avec la réalité ?

    je suppose que tu as généré la classe RecordSetContact à partir du Wizzard. Donc tes champs sont déjà tous déclarés. Utilises peut-etre plutot la variable membre m_nFields de CDaoRecordset ou mieux, utilises le mécanisme mis en place par les MFC pour lire directement tes champs dans les variables membres de la classe générée ...

    @+

  3. #3
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut
    Bonjour,
    Effectivement, je l'ai généré à partir du Wizzard, seulement je ne suis pas certain d'accéder à la classe CDaoRecordset, je crois que j'ai accès seulement à CRecorset et à CDatabase.
    Quels sont ces mécanismes ? Comment les utiliser ?

    PS : m_nFields ne fonctionne pas non plus.

    Merci.

  4. #4
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Quand tu généres la classe par le Wizzard, tu as une classe personnalisée dérivant de CDaoRecordset avec des variables membres qui correspondent à tes champs.

    Il suffit d'interroger les variables membres pour voir le contenu d'un champ du recordset. Tout est géré de maniere transparente, il n'y a pas a faire de GetFieldValue()

    C'est un peu le meme mécanisme que dans les boites de dialogues (fonctions commençant par DDX_ ou DDV_)

    Donc si tu as un champ [Toto] de type int dans ton recordset, tu trouveras une variable membre qui s'appelle m_Toto de type int aussi dans la classe générée par le Wizzard.

    Suffit de lire la variable pour connaitre la valeur du champ [Toto] pour l'enregistrement en cours.

    pour l'écriture de la variable, il faut d'abord appeler la méthode Edit(), ensuite mettre à jour les variables membres puis faire un Update()

    @+

  5. #5
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut
    Ok merci bien.
    Je vais essayer la lecture dans un premier temps.
    Si j'ai des problèmes pour l'écriture, je reviendrais poster ici.

    Merci.

  6. #6
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut
    ReBonjour,
    Aucun soucis pour la lecture, par contre l'écriture...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            //Parcourt de la base et écriture dans les champs qui nous interressent
    	while (!spRecordSetContact.IsEOF())
    	{
    			if(spRecordSetContact.m_CodSoc == 10)
    			{
    				spRecordSetContact.Edit();
    				spRecordSetContact.m_CodSoc = 22;
    				if(!spRecordSetContact.Update())
    					AfxMessageBox(_T("Echec Update"));
    			}
     
    		spRecordSetContact.MoveNext();
    	}
    Il ne génère pas d'erreur mais la base n'est pas mise à jour. Enfin la valeur du champ CodSoc n'est pas remplacé par 22.

    Merci.

  7. #7
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    pourtant le code me parait juste. es-tu sûr que la base n'est pas en lecture seule (le Update() aurait dû lever une exception normalement) ?

    @+

  8. #8
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut
    Je ne crois pas que la base soit en lecture seule.
    Je pense également que le Update devrait lever une exception s'il y avait un problème.

    Ne faut-il pas faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spDatabase.CommitTrans()
    Afin d'enregistrer les changements sur la base ?

  9. #9
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Ne faut-il pas faire un truc du genre :


    Code :
    spDatabase.CommitTrans()
    c'est quand tu veux passer par un journal de transaction, afin de pouvoir faire un RollBack (marche arrière des modifications)

    ce n'est pas le cas ici, puisque tu n'emploies pas de BeginTrans() et cie ...

    ton recordset est déclaré en Snapshot ou Dynaset ?
    je pense pas que ça change grand chose ... mais essaye Dynaset

    @+

  10. #10
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut
    Il est en Dynaset...

    Merci pour les explications.

  11. #11
    Membre habitué Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Points : 127
    Points
    127
    Par défaut
    Désolé c'est de ma faute...
    Je ne sais pas si j'ose le dire...
    Bon d'accord, j'ai une première boucle qui parcourt tout mes champs... Et après cette boucle... Je ne reviens pas au premier... Il ne rentre donc jamais dans le while...

    Désolé

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

Discussions similaires

  1. [PDO] ERREUR PDO : Invalid parameter number
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/12/2013, 19h57
  2. Réponses: 6
    Dernier message: 21/10/2005, 18h59
  3. Oracle 7 -> Oracle 8 : "Invalid Row Id"
    Par gmartintin dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/10/2004, 11h39

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