CRecordset, wie komm ich an eine CDBExeption ran, die die Memberfunktion delete wirft ?



  • Aloha,

    ich habe eine Access - DB an mein Projekt angebunden, und greife darauf per ODBC zu in der Form :

    CDatabase db;
    CTabelle_gtyp rs(&db);  // gesubclasste CRecordset
    
    if(db.OpenEx("DRIVER=Microsoft Access Driver(*.mdb);ODBC;DBQ=db.mdb;PWD=password;",CDatabase::noOdbcDialog))
    { 
    
    		rs.Open( CRecordset::dynaset ,"SELECT * FROM Gtyp WHERE ID=10820002");
    
    etc.
    
    ....
    
    }
    

    Alles wunderbar. Nun werden in der DB Beziehungen deklariert.

    Möchte ich jetzt einen Datensatz löschen, der in einer Beziehung steht wirft mir diese Funktion, besser is es, eine CDBException;

    CRecordset::Delete
    virtual void Delete( );
    throw( CDBException );

    rs.delete();
    

    Ein Fenster poppt auf, es steht drin, daß eine Beziehung bestünde, und dieser Datensatz nicht gelöscht werden könne.

    Dieses Fenster wird automatisch generiert, ich will aber den Text erweitern, bzw. komplett ändern.

    CDBException hat drei Membervaiablen laut MSDN, eine davon beinhaltet den Text für die Messagebox.
    Also, so dünkt ich mir, muß ich an die Exception rankommen, um die Nachricht zu ändern.

    Ich habe keine Ahnung wie ich die Excaption fangen kann, bzw. an welche Quellcodestelle.

    Besten Dank

    Grüße

    BOA



  • Guck in die MSDN:

    Stichworte: try catch TRY CATCH (ja zwei Schreibweisen...)
    Wenn du nach CDBExeption suchst, könntest du auch weiterkommen.

    🙂



  • Aloha,

    hat sich gelöst, ich gehe net über einen Recordset an die Sache sondern per handgemachter SQL-Anweisung über CDatabase.

    if(db.IsOpen()) 
    { 
    
       CString strCmd = "DELETE FROM Gtyp WHERE ID=10820002";
    
       TRY
       {
    
             db.ExecuteSQL( strCmd );
    
       } 
    
       CATCH(CDBException, e)
       {
    
    	AfxMessageBox("Dieser Datensatz ist tabu !!! ");			
    
       }
       END_CATCH 
    
       db.Close(); 
    
    }
    

    Wunnerbar, so kann ich mir die Ausgabe stricken, wie ich lust und laune habe.

    @estartu_de
    An den Stellen bin ich in der MSDN net weitergekommen, deswegen mein Hilferuf hier. Ich hatte keine Idee wohin CRecordset die Exeption wirft, also an welche Stelle ich den TRY-CATCH-BLOCK hinschreiben sollte.
    Tja, daß ich Crecordset da lassen kann, wo der Pfeffer wächst, fiel mir erst zu spät ein (nachdem der Thread eröffnet war 👎 )

    Ich dank Dir trotzdem vielmals. 👍

    Grüße

    BOA



  • Oh, dann entschuldige den Verweis...

    Falls es für eine Erklärung nicht zu spät ist:
    Im try stehen alle Befehle (sinngemäß zusammengefasst), die eine Behandlung durch catch erfordern. Nach try kommt catch.

    War die Erklärung verständlich? 🙂



  • Aloha,

    yep, vielen Dank, wunderbar.

    Ja, so ist das, wenn die Basics nach und nach aus meinem Hirn schwinden. 👎
    Es bedarf immer wieder netter Leute wie Dich, einiges aufzufrischen. 👍

    Bei dem speziellen Prob, mit CRecordset::delete(), ging das mit einem TRY-CATCH-BLOCK irgendwie net.

    Ich hatte folgendes probiert :

    TRY
    {
    
          rs.delete();
    }
    CATCH(CDBExeption,e)
    {
    
          AfxMessageBox("Was zur Hölle willst Du löschen ? Das geht net");
    
    }
    

    Aber das hat nicht gefunzt ?!?!
    Ich weiß es net, woran es lag.

    Trotzdem tausend und einen Dank noch einmal 😋

    Grüße

    BOA


Anmelden zum Antworten