"Debug Assertion Failed " bei CRecordsets



  • Hallo

    Ich arbeite mit dem ODBC Access Treiber unter C++ und oeffne eine Datenbank sowie einen Recordset darauf. Das ist der Code fuer den Recordset

    // neu initialisieren mit aktueller Datenbank
        CRecordset *rs = new CRecordset(&m_DB);
        m_pRS = rs;
        m_hStmt = m_pRS->m_hstmt;;
    
        SDWORD b1;
        SDWORD b2;
    
        SQLBindCol (m_hStmt, 1, SQL_C_CHAR, (PTR)m_mAkt.m_sName, sizeof(m_mAkt.m_sName), &b1);
        SQLBindCol (m_hStmt, 2, SQL_C_DOUBLE, (PTR)&m_mAkt.m_fDichte, sizeof(m_mAkt.m_fDichte), &b2);
        SQLBindCol (m_hStmt, 3, SQL_C_CHAR, (PTR)m_mAkt.m_sBeschreibung, sizeof(m_mAkt.m_sBeschreibung), &b1);
    
        try
        {
            m_pRS->Open( CRecordset::snapshot, 
                        _T("SELECT * FROM Material ORDER BY Materialname, Dichte"),
                        CRecordset::none);
    
            // Recordset durchzaehlen
            GetMaterialNum();
        }
        catch ( CDBException *pDBE)
        {
            AfxMessageBox("Database Fehler: "+pDBE->m_strError);     
            return false;
        }
    

    Wann immer ich jetzt den Recordset editieren will, updaten, oder am Ende Werte hinzufuegen will (addnew) bekomme ich seitens des compilers debug assertion failures. Kann mir jemand sagen warum? Im Rekordset navigieren funktioniert ohne Probleme, aber Datenverändern in keinster Weise. Ich weiss echt nicht mehr weiter

    Dnke +Gruss
    Stefan



  • Hallo,
    sehe ich das richtig, dass du die MFC verwendest?



  • das sehe ich auch Hume :p 😃

    ps: isses günstig ne exception per pointer zu catchen?



  • ps: isses günstig ne exception per pointer zu catchen?

    Nein. In der Regel nicht, da sich hier ein Problem mit der Resource-Freigabe gibt.

    Es gibt ja nur drei Möglichkeiten:
    1. Der Pointer zeigt auf ein lokales Objekt -> MÖÖP! Das ist beim catch leider längst tot -> undefiniertes Verhalten

    2. Der Pointer zeigt auf ein statisches Objekt -> Ok. Keine Freigabe nötig

    3. Der Pointer zeigt auf ein dynamisch allokiertes Objekt -> Ok. Aber wer löscht das Objekt? Und wann? und wie (delete oder doch was anderes?) ?

    Das Problem ist, dass *alle* Stellen im Programm die by-pointer catchen wissen müssen, ob 2. oder 3. gilt. Und wenn 3. gilt ob sie das Objekt löschen sollen.



  • deswegen by-reference catchen oder nich?!
    jedenfalls mach ich das immer über Referenzen.
    und bisher hat das auch immer geklappt 🕶



  • deswegen by-reference catchen oder nich

    Jo. Throw by value, catch by (const) refrence. Ist ne ganz gute Regel.

    Der Thread ist hier trotzdem falsch. Ich verschiebe ihn jetzt nach MFC.

    [ Dieser Beitrag wurde am 22.09.2002 um 12:21 Uhr von HumeSikkins editiert. ]


Log in to reply