Visual Studio 2008 und CRecordset -.-
-
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 habeIch 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 nochmalsGrü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