CRecordset & MySQL // .Addnew
-
Moin Leutz,
ich hab versucht mir mit dem Wizard (Visual Studio .NET) eine Klasse zu erstellen, die von CRecordset abgeleitet ist. Aber leider stürtzt da immer VS ab *gr* - voll verbuggt das Ding.Naja also hab ich es ohne Wizard versucht. Leider stürtzt da immer alles ab bei (cMyRecordset.Open()). Da hab ich wohl was falsch gemacht kann mir einer verraten was?
Mein Code:
Aufruf meiner Klasse:
CFehlerReport dbRecordSet; if( !dbRecordSet.Open( ) ) // hier stürtzt alles immer ab return; dbRecordSet.AddNew( ); dbRecordSet.m_TEXT = _T("Test"); if( !dbRecordSet.Update( ) ) { AfxMessageBox( "Record not added; no field values were set." ); return; }
Meine Headerfile zur Klasse:
class CFehlerReport : public CRecordset { DECLARE_DYNAMIC(CFehlerReport) public: CFehlerReport(CDatabase* pDatabase = NULL); // Field/Param Data //{{AFX_FIELD(CFehlerReport, CRecordset) CString m_ID; CString m_TEXT; CString m_STAMP; CString m_USER; //}}AFX_FIELD // Implementation protected: virtual CString GetDefaultConnect(); // Default connection string virtual CString GetDefaultSQL(); // default SQL for Recordset virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support };
Mein Code zur Klasse:
// FehlerReport.cpp : implementation of the CFehlerReport class // #include "stdafx.h" #include "FehlerReport.h" ///////////////////////////////////////////////////////////////////////////// // CFehlerReport implementation IMPLEMENT_DYNAMIC(CFehlerReport, CRecordset) CFehlerReport::CFehlerReport(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(CFehlerReport) m_ID = ""; m_TEXT = ""; m_STAMP = ""; m_USER = ""; m_nFields = 4; //}}AFX_FIELD_INIT m_nDefaultType = dynaset; } CString CFehlerReport::GetDefaultConnect() { return _T("DSN=GAGTEST;DESC=MySQL ODBC 3.51 Driver DSN;DATABASE=TEST;SERVER=192.168.10.164;UID=myroot;PASSWORD=2Qli92;PORT=3306;OPTION=3;STMT=;"); } CString CFehlerReport::GetDefaultSQL() { return _T("SELECT * FROM FEHLER ORDER BY ID"); } void CFehlerReport::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CFehlerReport) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Text(pFX, "ID", m_ID); RFX_Text(pFX, "TEXT", m_TEXT); RFX_Text(pFX, "STAMP", m_STAMP); RFX_Text(pFX, "USER", m_USER); //}}AFX_FIELD_MAP }
-
Hm,
ich übergebe der Open()-Methode immer als zweiten Parameter die Tabelle, die ich öffnen will. Arbeite aber auch mit ODBC, nicht mit MySQL-Datenbanken und kenne mich daher nicht da aus.
Bei mir ist es auch so, dass der Klassen-Ass. immer abstürzt, wenn ich eine CRecordset-Klasse erstellen will. Meistens liegt es daran, dass die Datenbank nicht im Projekt-Verzeichnis lag.MfG
Happosai
-
Steht in der FAQ.
Für MYSQL gibt es ein Schnittstelle und die ist um längen schneller als ODBC
-
Ja, schon klar das direkt schneller ist. Und ich find es auch einfacher zu handeln. Aber das hilft mir nicht viel, denn ich brauch unbedingt eine Rollback möglichkeit. Diese gibt es meines wissens nach noch nicht bei MySQL. Also nehme ich liber den etwas langsammerern ODBC Treiber und hab dafür CRecordset mit einer Rollback funktion.
Oder wie kann ich bei einer Directconnection zu MySQL sicher stellen, dass bei zwei INSERT endweder beide erfolgreich sind oder garkeiner.
-
@Happosai
> Meistens liegt es daran, dass die Datenbank nicht im Projekt-Verzeichnis lag
Wie soll ich denn meine Datenbank ins Projektverzeichnis bekommen *versteht nicht*. Gilt das nur für Excel DBs oder ähnlich?btw. haste mal n beispiel wie du dein Recorset öffnest?
-
hm...
sonst versuch es doch statt mit den ms klassen mit der original library von mysql. da bekommst du eine api für c und c++, die absolut einfach zu verwenden ist und nicht abschmiert
-
ups sorry - die antwort war schon da
ums gutzumachen:
du kannst doch auch mit sql checken ob die datensätze BEIDE angekommen sind. und falls nicht kannst du ja die datensätze per id (die ja jede halbwegs ausgereifte db haben sollte) wieder löschen.
um rauszufinden welche ids automatisch vergeben wurden gibts die funktion: mysql_insert_id()die original api ist hundertmal besser. wir habens lange mit den ms schnittstellen versucht aber die sind so fehleranfällig und unkontrollierbar, dass man den etwas geringeren komfort gerne in kauf nimmt
-
Rollback:
Schau dir mal die MYSQL-Docu an und dann hast du soetwas. Stichwort: Tabellentyp