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] Impossible de mettre à jour dans un CRecordset.


Sujet :

MFC

  1. #1
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut [MFC] Impossible de mettre à jour dans un CRecordset.
    Bonjour,

    j'ai encore un petit problème avec un objet de type CRecordset, son champs m_bUpdatable reste à FALSE même après un open sur un objet CDatabase qui a bien ce champ-là à TRUE.

    voici le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CDatabase blarf;
     
    blarf.Open(_T("base_test_mssql"),FALSE,FALSE,"ODBC;" , FALSE);
     
    CRecordset r(&blarf);
     
    r.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT max(typpreparation) FROM dbo.type_preparation");
    Après l'Open, je vois que le champ m_bUpdatable est à zéro, en fouillant un peu, je trouve une erreur se produisant dans la fonction PrepareAndExecute quand on fait appel à une fonction ODBC nommée SQLPrepare qui me sort une erreur S1C00 comme quoi mon driver est "not capable".

    J'utilise SQL Server 2000. Sont-ce mes drivers ODBC qui ne sont pas à jour, ou y a-t-il autre chose à faire ?

    Si quelqu'un est inspiré ...

  2. #2
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut
    En fait j'ai une autre question à présent, concernant les CRecordset : j'ai une requête contenue dans la fonction GetDefaultSQL() mais quand cette fonction est appelée, la requête qui est renvoyée est tronquée et incomplète (ma requête est du type select ... from ... where, et là je n'ai qu'un select incomplet , ce qui déclenche une erreur, comment est-ce possible ?

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Bjr,
    ce qui déclenche une erreur, comment est-ce possible ?
    Un truc si on n'y a pas pensé : essayer la requête dans Access directement avec le générateur de requêtes ( mais en tapant du SQL directement )

    mais quand cette fonction est appelée, la requête qui est renvoyée est tronquée et incomplète (ma requête est du type select ... from
    Désolé de répondre un peu de travers mais j'ai laissé tomber DAO et les CRecordset.
    J'avais le même problème : je faisais une requête sur un champs pour récupérer une chaîne de caractêre qui était tronquée.
    Alors je n'ai pas persisté plus et tout converti avec l'utilisation de ADO plutôt que DAO.
    Et avec ADO ça marche très bien.Le pb est qu'il faut MSDAC 2.X installé sur le client.
    De toute façon , DAO est appelé à disparaître......

  4. #4
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par addicted_to_MFC
    Bjr,
    ce qui déclenche une erreur, comment est-ce possible ?
    Un truc si on n'y a pas pensé : essayer la requête dans Access directement avec le générateur de requêtes ( mais en tapant du SQL directement )

    mais quand cette fonction est appelée, la requête qui est renvoyée est tronquée et incomplète (ma requête est du type select ... from
    Désolé de répondre un peu de travers mais j'ai laissé tomber DAO et les CRecordset.
    J'avais le même problème : je faisais une requête sur un champs pour récupérer une chaîne de caractêre qui était tronquée.
    Alors je n'ai pas persisté plus et tout converti avec l'utilisation de ADO plutôt que DAO.
    Et avec ADO ça marche très bien.Le pb est qu'il faut MSDAC 2.X installé sur le client.
    De toute façon , DAO est appelé à disparaître......

    Tout d'abord désolé, je ne savais pas que ça concernait les MFC ...

    En fait je n'utilise pas DAO mais ODBC pour me connecter à la base. Pour situer le contexte : j'effectue une migration de Sybase vers SQL Server, et dans le système il y a un batch qui est un "service" en Visual C++, et dans ce batch les accès aux données se font via des CRecordset avec connexion ODBC.

    Malheureusement les CRecordset merdent beaucoup : j'ai enfin trouvé une solution pour lui dire de laisser le CRecordset à "true, mais à présent c'est la fonction update() qui me renvoie une exception, dont le message d'erreur n'est pas très compréhensible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erreur ODBC: Aucune ligne n'a été affectée par l'opération de mise à jour ou de suppression. Erreur win32: Le type de ressource spécifié ne peut être trouvé dans le fichier image.

    Euh sinon, ADO ça marche comment ?

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Je pense que CRecordset c'est une classe MFC non ?
    Parce qu'en général tout ce qui commence par C.. est une classe MFC
    ( T... pour les classes de la VCL de Borland . Ex TButton )

    Euh sinon, ADO ça marche comment ?
    l'API ADO peut être utilisé avec n'importe quel compilateur C++ compatible win32 (donc aussi bien avec Borland C++ ..)
    Il faut d'abord créer une connexion vers la base de donnée


    http://www.microsoft.com/data/ado/default.htm
    exemple :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdprofilterxvc.asp

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 55
    Points : 49
    Points
    49
    Par défaut pb de longueur peut etre
    g le meme probleme que toi et ma requette est couper.
    le probleme c est que la variable qui recoit la requette ne stock que 255 caracteres.
    donc si tu trouve une solution je suis grave interresser pour que tu m explique comment gerer ce probleme!!

    merci et bonne chance
    @RAIZER@

  7. #7
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut Re: pb de longueur peut etre
    Citation Envoyé par R@IZER
    g le meme probleme que toi et ma requette est couper.
    le probleme c est que la variable qui recoit la requette ne stock que 255 caracteres.
    donc si tu trouve une solution je suis grave interresser pour que tu m explique comment gerer ce probleme!!

    merci et bonne chance
    En ce qui concerne la requête qui est coupée, ça ne semble pas être un problème. Certes on la voit tronquée, mais elle s'exécute bien et donne les résultats escomptés (dans mon exemple ma requête fait plus de 1000 caractères).

    Sinon pour l'autre problème avec la fonction Update(), je n'ai pas réussi à trouver le problème, car à un moment on est coincés dans le code, explication

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    RETCODE nRetCode;
    AFX_ODBC_CALL(::SQLSetPos(m_hstmt, 1, wPosOption, SQL_LOCK_NO_CHANGE));
    if (!Check(nRetCode))
    {
    	TRACE0("Error: failure updating record.\n");
    	AfxThrowDBException(nRetCode, m_pDatabase, m_hstmt);
    }
    // Only have data-at-execution columns for CLongBinary columns
    if (nRetCode == SQL_NEED_DATA)
    	SendLongBinaryData(m_hstmt);
    // This should only fail if SQLSetPos returned SQL_SUCCESS_WITH_INFO explaining why
    if (nRetCode == SQL_SUCCESS_WITH_INFO && GetRowStatus(1) != wExpectedRowStatus)
    	ThrowDBException(AFX_SQL_ERROR_UPDATE_DELETE_FAILED);
    SQLSetPos est LA fonction odbc qui va vraiment mettre à jour sur la base de données. Celle-ci marche bien, elle donne un code retour de 1, donc tout va bien.

    Mais c'est le tout dernier traitement qui foire en fait, celui avec la fonction GetRowStatus. Si on regarde le corps de cette fonction, on trouve ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _AFXDBCORE_INLINE WORD CRecordset::GetRowStatus(WORD wRow) const
    { ASSERT(IsOpen()); ASSERT(wRow > 0); return m_rgRowStatus[wRow-1]; }
    Donc on voudrait bien savoir ce que contient substantiellement la variable m_rgRowStatus, et bien on ne le saura pas, rien dans l'aide de visual, on ne trouve rien dans msdn non plus ...

    Du coup la solution est d'utiliser la fonction ODBC à part et toute seule, et ça marche (pour l'instant)

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

Discussions similaires

  1. impossible de mettre à jour recordset
    Par zephyr59 dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2016, 10h02
  2. Impossible de mettre à jour ma WebApp dans Tomcat
    Par Le vagabond dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 23/06/2010, 09h38
  3. Réponses: 4
    Dernier message: 29/05/2006, 17h15
  4. Réponses: 16
    Dernier message: 04/05/2006, 23h02
  5. Impossible de mettre à jour un champs
    Par _developpeur_ dans le forum Access
    Réponses: 4
    Dernier message: 23/01/2006, 13h17

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