Komme nicht weiter - ODBC, Access, CRecordset
-
Gute Tag,
Ich versuche im Moment im Visual Studio 2005 mit VC++ auf eine Access DB zuzugreifen per ODBC. Die Datenverbindung habe ich bereits eingerichtet, allerdings hapert es jetzt daran die Daten anzuzeigen. Ich habe bereits in meinem Buch "Visual C++ - Windows-Programmierung mit den MFC" das Kapitel gelesen, als auch das Tutorial von estartu gelesen, doch irgendwie steige ich noch nicht durch.
Mein Projekt enthält eine CRecordSet und CRecordView und wie es aussieht, steht auch die Verbindung zur DB, doch ich weis nicht wie ich die Daten anzeigen lasse.
1. Ich würde gerne die ganze DB (ist nicht groß) in einer Art Tabelle anzeigen lassen. Leider finde ich in der Toolbox kein Element in die Richtung.
2. Wie tausche ich Daten zwischen den Membervariablen für die Spalten mit den Spalten der Tabelle in meiner GUI aus?
Also ich würd eine Schleife machen, die in der Access-DB vom letzten bis zum ersten Element durchläuft und dann jeden Datensatz in die Tabelle in meinem Programm anzeigen (dass der letzte oben steht). Ich habe die Sache mit DoDataExchange und DoFieldExchange leider noch nicht ganz verstanden.
Ich habe auch leider kein Beispielcode gefunden, der sich auf Access bezieht wo ich hätte abschauen können.
Für Hilfe wär ich sehr dankbar
Liebe Grüße
Bastiedit:
Das hier sieht ja schon recht interessant aus:void CODBC_Test1View::DoDataExchange(CDataExchange* pDX) { CRecordView::DoDataExchange(pDX); // Sie können hier DDX_Field*-Funktionen einfügen, um die Steuerelemente mit den Datenbankfeldern zu verbinden: // DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet); // DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet); // Weitere Informationen finden Sie in den MSDN- und ODBC-Beispielen. }Nur wann ruft sich die Methode auf? Und ich glaube es gibt keine eigene DDX Funktion um einen String an eine Tabelle als neues Element zu senden

Lasse mich gern eines besseren belehren.
-
Hallo!
Also es wäre mir neu, wenn man die Daten direkt mit DoDataExchage und DoFieldExchange anzeigen lassen könnte.
Ich hole in einer Funktion im View die Daten aus dem Recordset und packe sie in die Member für die Anzeige.
So in der Art:m_strVorname = m_pSet->GetVorname(); m_strNachname = m_pSet->GetNachname(); UpdateData(FALSE);Und es gibt kein Control was dir automatisch eine Tabelle anzeigt.
Oft bietet sich aber ein CListCtrl an. Zu Übungszwecken tuts aber sicher auch eine CListBox oder ein mehrzeiliges CEdit.
-
Hast du evtl. irgendwo mal ein Beispielprogramm für VS2005, ow ich mir das mal genauer anscheuen kann? Wäre sehr hilfreich.
Liebe Grüße
Basti
-
Direkt aufrufen tust du die garnicht. Wenn du Variablen mit Steuerelementen verbunden hast, wäre UpdateData die Wahl des Vertrauens

-
Hallo
Ich habe mich nochmal an das Problem gesetzt und eure Tips beherzigt und mir das alles noch einmal durch den Kopf gehen lassen. Und zwar sieht es nun so aus, dass ich alle Datensätze aus der DB holen lasse und in ein CListCtrl einfüge. Mein Code sieht nun folgendermaßen aus (Problem kommt danach):void CODBC_Test1View::OnBnClickedButton1() { CString Cs_Ausgabe; CString Cs_Fertigmeldung, Cs_Palette, Cs_Spuler, Cs_Spulen, Cs_Gekippt, Cs_ID; if (m_pSet->IsOpen()) { m_pSet->MoveLast(); while (m_pSet->IsBOF() == 0) { Cs_Fertigmeldung = m_pSet->m_FertigMeldung.Format(L"%x %X"); Cs_Palette = m_pSet->m_Palette; Cs_Spuler = m_pSet->m_Spuler; Cs_Spulen.Format(_T("%lu"),m_pSet->m_Spulen); Cs_Gekippt.Format(_T("%lu"),m_pSet->m_gekippt); Cs_ID.Format(_T("%lu"),m_pSet->m_ID); Cs_Ausgabe = Cs_Fertigmeldung + _T(" ") + Cs_Palette + _T(" ") + Cs_Spuler + _T(" ") + Cs_Spulen + _T(" ") + Cs_Gekippt + _T(" ") + Cs_ID; m_ListBox1.AddString(Cs_Ausgabe); m_pSet->MovePrev(); UpdateData(false); } } else { MessageBox(_T("Verbindung zur Datenbank nicht hergestellt"), _T("Verbindungsfehler"), MB_OK); } // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. }Meine Spalten in der Access DB sind so benannt:
long m_ID; CStringW m_Palette; CStringW m_Spuler; long m_Spulen; long m_gekippt; CTime m_FertigMeldung; //Datum, Zeit der FertigmeldungMein einziges Problem ist nun, dass egal ob ich die DB nun von vorne oder von hinten auslesen lasse, das aktuellste Datum steht immer unten und das älteste oben. Allerdings soll das ganze aus Komfortgründen genau andersherum sein, also dass die aktuellsten Fertigmeldungen oeben stehen. Ich versteh nicht warum die Reihenfolge dieselbe ist, egal ob ich die Liste nun von vorne oder von hinten (zeitlich gesehen) aufbauen lasse.
Kann mir jemand sagen warum es so ist und wie ich das ganze ändern kann?
Liebe Grüße
Basti
-
Okay, bin dahintergekommen: Es gibt eine Eigenschaft "Sortieren" -.-