Debug Assertion Failed bei CRecordset.Open *völlig ratlos*



  • Hallo,

    ich möchte zu einer MySQL-Quelle connecten über MFC gestützte ODBC.
    Über normale WinApi aufrufe klappt alles wunderbar.

    Aber folgender MFC-Code scheitert.
    Im Debug-Mode beendet eine Assert das Programm bei markierter Zeile.
    Exception habe ich hier nicht abgefangen, es werden ja auch keine geworfen.

    sprintf((char*)InStr,"DSN=%s;SERVER=%s;UID=%s;DATABASE=%s;PWD=%s;"
       ,strDSN.c_str(),strSERVER.c_str(),strUID.c_str(),strDB.c_str(),sqlc_Passwd);
    
      int ret = my_DB.OpenEx((LPCSTR)InStr,CDatabase::openReadOnly);
      if (ret==0) return false; //ret hat immer den Wert 1, also erfolgreich
    
      CRecordset my_Rec(&my_DB);
      my_Rec.Open(CRecordset::snapshot,NULL,CRecordset::readOnly); //Assert hier!
    

    Die Verbindung durch den my_DB.OpenEx Aufruf klappt, er zeigt auch mit ->GetDatabaseName() das Richtige an.

    Hier nochmal der MFC-Code des gewissenen ASSERTS:

    // "SELECT <user column name list> FROM <table name>"
    void CRecordset::BuildSelectSQL()
    {
    ASSERT_VALID(this);
    ASSERT(m_hstmt != SQL_NULL_HSTMT);
    
    // Ignore queries with procedure call keyword or output param
    if (!(_tcsnicmp(m_strSQL, _afxCall, lstrlen(_afxCall)-1) == 0 ||
    _tcsnicmp(m_strSQL, _afxParamCall, lstrlen(_afxParamCall)-1) == 0))
    {
      // Ignore queries already built
      if (_tcsnicmp(m_strSQL, _afxSelect, lstrlen(_afxSelect)-1) != 0)
      {
        // Assume m_strSQL specifies table name
        ASSERT(m_nFields != 0);  //<<------------------ das isser!
    

    Ja gut, er hat wohl keinen Tablenamen, aber gerade die wollte ich mir ja auflisten lassen über das Recordset.
    Ausserdem verstehe ich nicht, warum er keine Exception wirft, wenn denn irgendein Parameter fehlen sollte, sondern gleich so kommentarlos abstürzt.
    Kann mir bitte jemand einen Tip dazu geben.

    Sepp


Anmelden zum Antworten