Visual Studio 2008 und CRecordset -.-



  • Pack das mal in TRY/CATCH Blöcke und schau ob du ne vernünftige Fehlermeldung bekommst.



  • Hi 🙂

    try
    {
        RecSet.Open(AFX_DB_USE_DEFAULT_TYPE, _T("SELECT * FROM events"));
    }
    catch(CDBException *pE)
    {
        std::cout << "HUHU";
        pE->ReportError();
        pE->Delete();
    }
    

    Ergibt im Release Modus folgende Meldung:

    MFC internal error: unable to load error string from ressource
    

    Im Debug Modus kommt mehrmals eine Assertion -.- Also das Auswahlfenster für die ODBCquelle kommt!

    Ich habe so das Gefühl, dass es etwas mit dem ODBC-Treiber zutun hat 😕
    Weil, wenn ich einfach mal eine andere Quelle auswähle, kommt eine Meldung, dass events nicht gefunden werden konnte o.ä...ist doch shit!

    Grüsse



  • Hast du den Rest auch mal in TRY/CATCH gepackt? Vielleicht gibts vorher schon ne Exception die du übersehen hast. Ich seh da sonst eigentlich nichts problematisches in dem Source. Entweder frisst er den erzwungenen ODBC Dialog nicht:

    dBase.OpenEx(NULL);
    

    oder was auch immer AFX_DB_USE_DEFAULT_TYPE ist, wird von deinem Treiber gar nicht unterstützt. Ersetz das mal durch ForwardOnly.



  • Hallo nochmal, sorry für die Doppelpost etc...

    Ich glaube ich weiß jetzt woran es liegt...

    Statt

    RecSet.Open(AFX_DB_USE_DEFAULT_TYPE, _T("SELECT * FROM events"));
    

    muss man anscheinend bei einer MySQL Datenbank:

    RecSet.Open(CRecordset::snapshot, _T("SELECT * FROM events"));
    

    benutzen.
    CRecordset::dynaset führt ebenfals zu Assertions...hatte irgendwo gelesen, dass dynaset nicht unterstützt wird, kann auch sein, dass es mir gemeldet wurde, als ich ein Beispielprogramm ausprobiert habe...naja, jedenfals scheint es nun ENDLICH zu klappen 🙂

    Ist es eigentlich unratsam die Daten direkt abzufragen?:

    RecSet.m_event_feld1
    

    Oder sollte ich für jedes Feld eine get-Methode einrichten?

    Danke dir vielmals, ohne dich wäre ich nie auf die Idee gekommen, dass es daran liegen könnte 🙂 Gleichzeitig habe ich Exceptions total missachtet!

    Dann kann ich ja jetzt meine Klasse schreiben, fals nochwas sein sollte nerve ich natürlich wieder 😉

    Grüsse



  • HateMFC schrieb:

    ...muss man anscheinend bei einer MySQL Datenbank:

    RecSet.Open(CRecordset::snapshot, _T("SELECT * FROM events"));
    

    benutzen.

    Aaahh, ok dann wars wirklich der Typ des Recordsets.

    CRecordset::dynaset führt ebenfals zu Assertions...hatte irgendwo gelesen, dass dynaset nicht unterstützt wird,

    Dynasets werden von den wenigsten DBs unterstützt. Unter Oracle sollte auch das funktionieren 😉

    Ist es eigentlich unratsam die Daten direkt abzufragen?:

    RecSet.m_event_feld1
    

    Oder sollte ich für jedes Feld eine get-Methode einrichten?

    Wenn die Member public sind, kannst du das machen. Die werden nach jedem Fetch aktualisiert. Sprich: Immer wenn du dich durchs Recordset bewegt hast order aktualisierst (MoveNext/Prev/Top/Bottom/Refresh). Aber wenn du richtig cool bist, baust du dir ne eigene Recordset Klasse die sich dynamisch anhand der Tabellenstruktur organisiert und verwendest dann Funktionen die einfach nur noch Feldnamen zuordnen und den entsprechenden Wert zurückliefern 🙂

    Danke dir vielmals, ohne dich wäre ich nie auf die Idee gekommen, dass es daran liegen könnte 🙂 Gleichzeitig habe ich Exceptions total missachtet!
    ...

    NP 😉



  • Hi 🙂

    Aber wenn du richtig cool bist, baust du dir ne eigene Recordset Klasse die sich dynamisch anhand der Tabellenstruktur organisiert und verwendest dann Funktionen die einfach nur noch Feldnamen zuordnen und den entsprechenden Wert zurückliefern

    Ja bei einem größeren Projekt wäre das sicherlich sinnvoll, bloß ich brauche lediglich ein SELECT-Statement, das war's...es ist immer das selbe. 🙄
    Aber danke für den Tipp 🙂 Lässt sich sicherlich mal einrichten, wenn ich die Handhabung der Klassen besser drauf habe 😉

    Ich habe noch zwei kleine Fragen:

    Ich handhabe die Abfrage, in meiner Klasse, wie folgt:

    //Das Drumherum mit Exceptions etc..habe ich mal weggelassen ;)
    void Klasse::Select(CString s) // "SELECT * FROM" table z.B.
    {
        m_RecSet.Open(CRecordset::snapshot,s);
        //TUE WAS
        m_RecSet.Close();
    }
    

    Ist sowas ok? Habe in der MSDN leider nichts gefunden, bzwgl. einer "query()-Funktion"...Jedenfals scheint es so, als würde er beim 2 Aufruf die Daten der ODBC Quelle gespeichert haben! Sprich, der ODBC Dialog kommt nur 1 mal, was gut ist!

    Ich brauche noch ein DELETE-Statement welches sich, so wie ich das sehe, nicht mit CRecordsets ausführen lässt, sondern nur mit CDatabase.
    z.B.:

    CDatabase cDB;
    cDB.execute("DELETE FROM table");
    

    Klappt wunderbar

    Problem ist, wenn ich beides einbaue, kommt der ODBC Dialog 2. mal 😕 Kann man da irgendwie was gescheites machen? Geht es irgendwie , dass Cdatabase die Verbindung aufbaut und CRecordset diese Daten ebenfals nutzt, ohne den Dialog erscheinen zu lassen?

    Grüsse 🙂



  • Ja, ich glaub du musst nur diesen forceOdbcDialog Parameter setzen:

    DatabaseObjekt.OpenEx(NULL, CDatabase::forceOdbcDialog)
    

    Das erzwingt dann beim Erstellen des Database Objekts den bekannten Dialog, welcher dann die Verbindung herstellt. Danach sollte er nicht mehr erscheinen, vorausgesetzt du übergibst dem Recordset auch immer brav den Pointer aufs Database Objekt:

    CDeineRecordsetKlasse RecSet(&DatabaseObjekt);
    

    btw: Das mit der select-Funktion kannste natürlich machen wie du willst. Meines wissens gibt es nur Open um ein Recordset zu öffnen.



  • Hi 🙂

    Danke, habe eben selbst gemerkt, dass ich den Pointer übergeben muss...das Recordset war auch als Member meiner Klasse eingerichtet, was i.d.F. unsinn ist.
    Jetzt funktioniert es Prima! Danke nochmals 🙂

    Grüsse



  • hooo... nimm ADO ^^ dann bist nicht MFC gebunden, und kannst es in allen c++ frameworks verwenden,,



  • Hi

    Also ich habe mir das nochmal durch den Kopfgehen lassen:

    Aber wenn du richtig cool bist, baust du dir ne eigene Recordset Klasse die sich dynamisch anhand der Tabellenstruktur organisiert und verwendest dann Funktionen die einfach nur noch Feldnamen zuordnen und den entsprechenden Wert zurückliefern 🙂

    Wie würde ich denn da am besten anfangen? Weiß nicht so recht, wie ich an die Tabellenstruktur komme 😕 etc...

    Habe schon überlegt mir mal ADO.NET anzusehen, aber ob das irgendwie hilft.

    Problem ist, dass ich wohl doch dynamische, nicht zur Laufzeit bekannte Tabellen abfragen muss.

    Grüsse 🙂



  • Unter ADO ist das sehr einfach. Du schickst die Abfrage ab und ADO erstellt dir automatisch ein passendes Recordset. Unter ODBC aber muss du vorher den entsprechenden Speicherplatz bereitstellen und an die (kommenden) Felder des Recordsets binden. Das passiert aber, bevor deine Abfrage überhaupt abgeschickt wird. Glaub ich hab das damals so gelöst, das ich erst ein temporäres Recordset mit 255 Feldern erstelle, die Abfrage abschicke und dann "on-the-fly" die Variablen anbinde. Die Informationen über die Felder und Datentypen kriegst du über verschiedene Memberfunktionen (GetODBCFieldInfo oder so AFAIK). Dieses Recordset Gefrickel war übrigens einer der Gründe, weshalb ich dann auf ADO umgestiegen bin 😃



  • Hi 🙂

    Lol ja sehe schon, Recordsets sind so gesehen nur zu gebrauchen, wenn man weiß, was man aus der Datenbank braucht.

    Naja mal schaun, werde gleich mal gucken, wie es sich mit Joins verhält und mal nach einem guten ADO Tutorial ausschau halten. Fals du zufällig ein gutes kennst, wäre ich einem Link nicht abgeneigt 🙂

    Was wäre denn empfehlenswerter ADO oder ADO.NET?

    Grüsse 🙂



  • Ich kann die Tage mal mein altes ODBC Zeug auf meine Website laden, dann kannste dir den Wahnsinn mal anschauen. ADO.NET hab ich noch nie ausprobiert, da <- immernoch Visual Studio 6 User. Schau mal auf codeproject.com, glaub da hatte ich maln Paar ganz gute ADO Sachen gesehen.



  • Hi 🙂

    Ich kann die Tage mal mein altes ODBC Zeug auf meine Website laden, dann kannste dir den Wahnsinn mal anschauen

    lol, ja das wäre sehr nett 🙂

    Danke für den Tipp, habe glaube ich schon was feines gefunden. ADO sieht sehr viel schöner aus bisher 😉 Trotzdem wäre es mal gut zu sehen, wie du dieses Problem mit RecSets erledigt hast.

    Danke, danke für deine Hilfe 🙂

    Grüsse


Anmelden zum Antworten