pb avec CRecordset, Ctime et Update() [RESOLU]

pb avec CRecordset, Ctime et Update() [RESOLU] - C++ - Programmation

Marsh Posté le 03-11-2003 à 08:22:43    

Salut à tous!
 
J'ai un pb avec des Ctime, un CRecordset et le Update() du CRecordset! Voila le truc.
J'ai une classe CPlanningrecordset dérivée de CRecordset. Elle a deux champs en CTime.  
 

Code :
  1. class CPlanningRecordset : public CRecordset
  2. {
  3. public:
  4. CPlanningRecordset(CDatabase* pDatabase = NULL);
  5. DECLARE_DYNAMIC(CPlanningRecordset)
  6. // Field/Param Data
  7. //{{AFX_FIELD(CPlanningRecordset, CRecordset)
  8. long m_ID_Planning;
  9. BYTE m_NumPlanning;
  10. CTime m_DateDebut;
  11. CTime m_DateFin;
  12. //}}AFX_FIELD
  13. ... plus la suite, pas important je pense
  14. }


 
Quand je veux faire un ajout dans ma table Planning via mon CPlanningRecordset, ça plante au niveau du Update() :
 

Code :
  1. int CPlanningDatabaseManagement::AddPlanning(int NumPlanning)
  2. {
  3. CDBVariant varValue ;
  4. if(!OpenDB())
  5. {
  6.   AfxMessageBox("Erreur à l'ouverture de la base de données!" ) ;
  7.   return -2 ;
  8. }
  9. CPlanningRecordset Planning(&NewDB) ;
  10. try
  11. {
  12.   Planning.Open(CRecordset::dynaset,NULL, CRecordset::appendOnly) ;
  13.   Planning.AddNew() ;
  14.   Planning.m_DateDebut = CTime(2003, 11, 1,0,0,0) ;
  15.   Planning.m_DateFin = CTime(2003, 11, 28,0,0,0) ;
  16.   Planning.m_NumPlanning = NumPlanning ;
  17.   Planning.Update() ; <-- crash
  18.   Planning.Close() ;
  19.   CloseDB() ;
  20. }
  21. catch(CDBException e)
  22. {
  23.   e.ReportError() ;
  24.   e.Delete() ;
  25.   CloseDB() ;
  26.   return -2 ;
  27. }
  28. return Planning_ID ;
  29. }


Je ne pige pas pourquoi ça plante! en fait, le pb vient d'un fichier visual : dbrfx.cpp
 

Code :
  1. // If not NULL, restore the value, length and proxy
  2.    if (!pFX->m_prs->IsFieldStatusNull(nField - 1))
  3.    {
  4.     AfxCopyValueByRef(pInfo->m_pvDataCache, &value,
  5.      plLength, pInfo->m_nDataType);
  6. Cette fonction change la valeur 'value' passée en paramètres et lui fout une valeur négative, alors qu'elle était égale à un ctime valide avant (Planning.m_dateDebut)
  7.     // Restore proxy for correct WHERE CURRENT OF operations
  8.     TIMESTAMP_STRUCT* pts =
  9.      (TIMESTAMP_STRUCT*)pFX->m_prs->m_pvFieldProxy[nField-1];


    pts->year = (SWORD)value.GetYear();  ça plante ici, puisque 'value' est négatif, donc le GetYear plante!
 
QQ1 a une idée, parce que là je suis séché!
 
TheFox
 
PS : le pire, c'est que si on regarde dans la base, le planning a bien été ajouté, ça plante dans le update mais apres avoir enregistré les champs!  :cry:


Message édité par TheFox37 le 04-11-2003 à 07:40:31
Reply

Marsh Posté le 03-11-2003 à 08:22:43   

Reply

Marsh Posté le 03-11-2003 à 13:18:11    

C est peut etre tres con ce que je dis mais
c est pas une question de temps?
en pas a pas ca marche?
 
Planning.Update() ; <-- crash
Planning.Close() ;
 
peut etre qu il ferme avant qu il ai le temps de faire la maj nan?
essaie de coller un timeout pour voir
 


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 03-11-2003 à 14:12:01    

ben je pense pas, vu qu'il plante pendant la fonction update, il n'a pas le temps d'aller jusqu'au close a priori

Reply

Marsh Posté le 03-11-2003 à 14:22:47    

TheFox37 a écrit :

ben je pense pas, vu qu'il plante pendant la fonction update, il n'a pas le temps d'aller jusqu'au close a priori

oki donc j avais raison!
c est bien question con  :ange:  
bein jai beau regarder je vois pas ce qui cloche...


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 04-11-2003 à 07:43:37    

Bon, j'ai résolu le pb !
 
Voilà d'où ça venait : qd on déclare une classe dérivée de CRecordset avec l'Appli Wizard, celui créer tout comme il faut. Enfin, presque tout : dans le constructeur par défaut, tout est mis à 0 ou _T("" ) ... sauf les CTime qui ne sont pas initialisés. Comme il repasse dans le constructeur pour récupérer des champs initiaux, ça plantait à cet endroit.
Je vais voir maintenant pourquoi il fait ça comme ça, mais pour corriger le pb il suffit de rajouter une pauvre ligne de mise à 0 dans pour chaque objet CTime le constructeur!

Reply

Marsh Posté le 04-11-2003 à 16:41:57    

arf , encore et toujours l initialisation...


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed