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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    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 chevronné 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
    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 éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    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 chevronné 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
    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 éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    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 éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    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.

+ 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