CRecordset will nicht :-(



  • Hallo zusammen,

    ich habe in der FAQ einen Beitrag über die Klasse CRecordset gefunden. Ich habe den Code ausprobiert, aber komme nicht zum gewünschten Ergebnis.
    Das Programm läuft fehlerfrei durch. Aber leider werden die Werte aus der Datenbank nicht in den Membervariablen gespeichert.

    StoreData.h:

    class CStoreData : public CRecordset
    {
    public:
    	CStoreData(CDatabase *pdb);
    	~CStoreData(void);
    
    	// fields
    	int m_num;
    	double m_value1;
    	double m_value2;
    	double m_value3;
    
    	virtual void DoFieldExchange(CFieldExchange* pFX);
    
    };
    

    StoreData.cpp:

    CStoreData::CStoreData(CDatabase *pdb): CRecordset(pdb)
    {
    	m_num = 0;
    	m_value1 = 0;
    	m_value2 = 0;
    	m_value3 = 0;
    }
    
    CStoreData::~CStoreData(void)
    {
    }
    
    void CStoreData::DoFieldExchange(CFieldExchange *pFX) {
    	pFX->SetFieldType(CFieldExchange::outputColumn);
    	RFX_Int(pFX, _T("num"), m_num);
    	RFX_Double(pFX, _T("value1"), m_value1); 
    	RFX_Double(pFX, _T("value2"), m_value2); 
    	RFX_Double(pFX, _T("value3"), m_value3); 
    }
    

    So benutze ich das ganze :

    dataBase.OpenEx("DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=myDBase;USER=USER;PASSWORD=PWD;OPTION=3;", 0);
    
    CStoreData asdf(&dataBase);
    asdf.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT * FROM data01", 0); 
    while(!asdf.IsEOF()) {
    	// funktioniert:
    	CDBVariant Wert;
    	asdf.GetFieldValue((short)0, Wert, DEFAULT_FIELD_TYPE);
    	TRACE("Test 1: %d\n", Wert.m_iVal); 
    	// funktioniert nicht:
    	TRACE("Test 2: %d \n",asdf.m_num);
    	asdf.MoveNext(); 
    }
    asdf.Close();
    

    Die while Schleife läuft genau zwei mal durch. (Es existieren auch nur zwei Einträge in der Tabelle). Die Member-Variablen werden aber nicht gesetzt. Woran kann das liegen? Ich bekomme keinen Fehler und es fliegt auch keine Exception.
    Wenn ich die Methode GetFieldValue aufrufe komme ich an die Daten ran.
    Muss ich noch etwas machen damit die Methode DoFieldExchange aufgerufen wird?
    Achja, ich benutze MySQL 4.1.12, MyQBDC 3.52 und Visual C++ 2003

    Noch was interessantes. Ich weis nicht ob es was damit zu tun hat:
    Ich habe die Klasse nicht über den Wizard erstellt sondern von Hand. Wenn ich es über das Menu mache stürzt mir VC++ ab. Ich kann zwar noch die Tabelle auswählen auf die ich zugreifen will aber wenn ich ganz zum Schluss auf „Fertig stellen“ gehen dauert es etwas und dann stürzt VC ab.

    In jedem Beispiel das ich gefunden habe wird DoFieldExchange einfach überschrieben und es funktioniert.
    Hat einer von euch noch einen Tipp für mich?

    Gruß
    felix



  • wie sieht deine Header-Datei aus?
    Ist das dabei?

    DECLARE_DYNAMIC(CStoreData)
    

    Außerdem legt der Klassenassistent noch folgende Methoden an

    CString CStoreData::GetDefaultConnect()
    {
    	return _T(<standardConnect>);
    }
    
    CString CTestKlasse::GetDefaultSQL()
    {
    	return _T(<standardtabelle>);
    }
    

    also das in < > sind Strings, habs mal durch Pseudocode ersetzt.



  • Im Konstruktor fehlt dir noch m_nFields, wo du die Spaltenanzahl reinschreiben musst.

    Ansonsten würde ich mal einen anderen Datentyp versuchen.
    Ich hab hier fast nur long. 🙂



  • Hallo,

    Danke euch beiden für die super schnelle Unterstützung!
    Wenn ich nFields setzte funktioniert es! 😮

    @ Pellaeon: mit DECLARE_DYNAMIC(CStoreData) schmeist mir der Linker eine Fehlermeldung (... Nichtaufgelöstes externes Symbol "public: virtual struct CRuntimeClass ...)
    Aber es geht ja auch so. 😕

    Jetzt hab ich aber noch eine andere Frage. Beim beenden bekomme ich jetzt Memory Leaks angezeigt (dreimal 8 Byte). Die sind erst aufgetaucht nach dem ich nFields auf 4 gesetzt habe. Muss ich zum aufräumen noch etwas aufrufen? 😞

    Gruß
    Felix II



  • Hast du den Block noch im cpp?

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    

    Wenn ja solltest du auf die Memoryleaks doppelklicken können und dann sehen, wo sie entstehen.



  • Wow, das kannte ich noch überhaupt nicht! 😮
    Der Fehler war wie so oft eine kleine Unaufmerksamkeit von mir 🙄

    Nochmals vielen vielen Dank für die schelle Hilfe!

    Gruß
    Felix II


Anmelden zum Antworten