Datenbank - Datenbankzugriff mit CRecordset
-
Hallo,
ich hab ein paar Zahlen, die per SQL in eine Datenbank geschrieben werden sollen.
Wenn ich aber in meinem c++ Programm einfach schreibe: Select from...
dann bringt er tausend Fehler.(Ich benutze das Visual C++, komm mit diesen Anwendungsassistenten nicht zurecht und deshalb wollte ich es "händisch" machen.)
Was muß ich noch machen?
Danke Sandra
-
Original erstellt von sandra:
**Was muß ich noch machen?
**Dir das hier durchlesen:
Wohin mit meiner Frage?Da Du wohl MFC nimmst, verschiebe ich den Beitrag dorthin. Ratschlag: versuche den Assistenten zu verstehen, ohne ist die Sache mit CRecordset in der MFC ziemlich umständlich.
-
Zuerst mal. Welche Datenbank ?
Access,MYSQL,MS-SQLSERVER,Oracle,etc.
-
Hallo,
Ich benutze eine Access-Datenbank.
Die ODBC-Treiber habe ich schon eingerichtet.
-
Also ich macht das immer per "Hand".
#include <afxdb.h> class CNumber_Tbl: public CRecordset { public: // Art der Felder long m_Nr; CString m_Number; double m_Tarif; CString m_Password; int m_AccessTimeout; CString m_HoleNumber; float m_R_ckverg_tung; float m_Provision; CString m_Provisionsart; CNumber_Tbl(CDatabase *pdb) : CRecordset(pdb) { m_Nr = 0; m_Number = _T(""); m_Tarif = 0.0; m_Password = _T(""); m_AccessTimeout = 0; m_HoleNumber = _T(""); m_R_ckverg_tung = 0.0f; m_Provision = 0.0f; m_Provisionsart = _T(""); m_nFields = 9; // Anzahl der felder in der Access } virtual void DoFieldExchange( CFieldExchange* pFX ) { // Fuer Datenaustausch //In Eckigen Klammern die Feldnamen in Access. pFX->SetFieldType(CFieldExchange: :outputColumn); RFX_Long(pFX, _T("[Nr]"), m_Nr); RFX_Text(pFX, _T("[Number]"), m_Number); RFX_Double(pFX, _T("[Tarif]"), m_Tarif); RFX_Text(pFX, _T("[Password]"), m_Password); RFX_Int(pFX, _T("[AccessTimeout]"), m_AccessTimeout); RFX_Text(pFX, _T("[HoleNumber]"), m_HoleNumber); RFX_Single(pFX, _T("[Rückvergütung]"), m_R_ckverg_tung); RFX_Single(pFX, _T("[Provision]"), m_Provision); RFX_Text(pFX, _T("[Provisionsart]"), m_Provisionsart); } };
Zugriff ueber
CString sODBCName = "Hier ODBC DSNNAME"; CDatabase dbnumber; CNumber_Tbl number(&dbnumber); dbnumber.Open(sODBCName); if(dbnumber.IsOpen()) { number.Open(CRecordset::snapshot, "select * from "); if (number.IsBOF()) { } else { while(!number.IsEOF()) { // number.m_irgendwas stehen die daten number.MoveNext(); } } dbnumber.Close(); }
-
Hi Sandra,
CRecordset eignet sich wirklich ganz gut, um auf eine MSA-DB zuzugreifen. Hab das auch so gemacht. Hatte am Anfang wirklich so meine Schwierigkeiten [hab noch nie eine DB-Schnittstelle geschrieben], aber mit der Zeit gewöhnt man sich ein.
Wenn Du irgendwelche Fragen hast - und scheinen sie auch noch so simpel - immer her damit, das geht anfangs jedem so!
-
hey unix tom du bist echt klasse !!!!
endlich mal einer der mir sagt, daß ich nicht unbedingt CRecordView als Ansichtsklasse benutzen muss, sondern die daten per hand über die klasse CRecordset auch beliebig ansprechen kann.
nun jetzt noch zwei fragen dazu:
1. kann ich mehrere tabellen von CRecordSet offen haben, oder macht ihr das immer so, dass ihr die daten einlest und danch die Datenbank wieder schließt. (möchte die datenbank in echtzeit akztualisieren)
2. ist es nicht besser mit CDAORecordSet bei einer Access-Datenbank zu arbeiten ?
-
-
morgen,
Meines Wissens kann man auch mehrere Tabellen geöffnet haben! einfach mal ausprobieren!!
CU
-
Man muß nicht die Datenverbindung schließen um ein neues SQL-Statment zu senden.
Ein
number.Close();
Reicht um das recordset zu löschen um eine neues zu senden.
Man brauchgt jedoch für jeden Table in der DB eine eigene Klasse da man die Anzahl der Felder und die Feldnamen braucht.
Es gibt sicherlich viele Befehle wo man dies nicht braucht aber da wir es kompliziert (Feldnamen auslesen, Typ auslesen, Variablen zur Laufzeit erstellen, etc.)Für eine 2te instanz des selben Tables
CDatabase dbnumber;
CDatabase dbnumber1;
-
CDatabase kann auch sehr hilfreich sein