db Speichern
-
123Kobold schrieb:
Hallo
mit Update meinst du doch UpdateData oder?
Und wie rufe ich Requery auf?Nein, das Update ist eine Funktion des CRecordSet's.
CRecordSet pSet = new CRecordSet() pSet->Edit(); pSet->Mein_Feld = "Neuer Wert"; pSet->Update(); pSet->Requery();
-
Von welcher Klasse leitest du CAdoDatabaseDoc ab?
-
Müsste RecordSet sein.
-
123Kobold schrieb:
Müsste RecordSet sein.
Müsste oder ist?
Das Requery sollte dann eigentlich gehen.
-
Bin noch ein Anfänger und habe mich nach dem Buch Visual c++ in 21 Tagen gerichtet.
Aber so viel ich weiss wird in der RecordSet auch die Funktion Open und MoveNext, MoveLast aufgrufen und das tue ich in dieser Klasse. Somit müsst sie von RecordSet abgeleitet sein.Hier ist ein bisschen Code aus der Klasse CAdoDatabaseDoc der glaube ich zeigt, dass es sich um Recordset handelt.
m_strConnection = _T("Provider=MSDASQL.1;Data Source=Serverdb "); m_strCmdText = _T("select * from Adressen"); // Zeiger auf Recordset und Bindung initialisieren m_ptrRs = NULL; m_piAdoRecordBinding = NULL; // COM-Umgebung initialisieren ::CoInitialize(NULL); try { // Datensatzobjekt erzeugen m_ptrRs.CreateInstance(__uuidof(Recordset)); // Datensatzobjekt öffnen m_ptrRs->Open((LPCTSTR)m_strCmdText, (LPCTSTR)m_strConnection, adOpenDynamic, adLockOptimistic, adCmdUnknown); // Zeiger auf Bindungsschnittstelle des Datensatzes holen if (FAILED(m_ptrRs->QueryInterface( __uuidof(IADORecordBinding), (LPVOID *)&m_piAdoRecordBinding))) _com_issue_error(E_NOINTERFACE); // Datensatzklasse an Recordset binden m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet); // Zeiger auf die Ansicht holen POSITION pos = GetFirstViewPosition(); CAdoDatabaseView* pView = (CAdoDatabaseView*)GetNextView(pos); if (pView) // Datensatzgruppe mit Formular synchronisieren pView->RefreshBoundData(); } // Fehler vorhanden? catch (_com_error &e) { // Fehler anzeigen GenerateError(e.Error(), e.Description()); }
-
Du arbeitest mit Ado - nicht mit ODBC, wofür CRecordset wäre.
Bei Ado weiß ich nicht, wie die Funktionen heißen, sorry.Was ist m_ptrRs für ein Typ? Dann geh in die Headerdatei davon und guck, von was die Klasse abgeleitet ist.
-
Hallo
hier habe es gefunden:_RecordsetPtr m_ptrRs
-
Das finde ich nicht in der MSDN.
Mach mal rechte Maustaste auf _RecordsetPtr und wähle "Gehe zu Definition". Wo landest du?
-
Also wenn ich auf "Gehe zu Definition" klicke wird mir folgender Code markiert angezeigt:
_COM_SMARTPTR_TYPEDEF
Und die komplette Zeile sieht so aus:
_COM_SMARTPTR_TYPEDEF(_Recordset, __uuidof(_Recordset));
Das ganze ist in: msado15.tlh
Ich hoffe, dass dir das weiter hilft.
-
Schade, damit kann ich nichts anfangen.
Wie gesagt, ich kann kein Ado - ich hatte nur die Hoffnung, dass ich dir was aus der MSDN raussuchen kann, was dir hilft.Ändere das Ado mal in den Betreff des ersten Postings rein, vielleicht schaut dann jemand rein, der das auch kann.
-
Hallo
ich habe jetzt zwei Möglichkeiten das Problem zu lösen.
Bei der ersten Möglichkeit bin ich mir nicht sicher, ob es so später vielleicht Probleme gibt und ob die Leistung nicht darunter leidet.
Und bei der zweiten Möglichkeit gibt es noch ein Problem.Hier die 1 Möglichkeit:
Ich rufe einfach MoveNext und MovePrevious auf und alles ist gespeichert und ich bin beim alten Datensatz.// Aktuellen Datensatz aktualisieren UpdateBoundData(); GetDocument()->MoveNext(); GetDocument()->MovePrevious(); // Formular mit den Daten des neuen Datensatzes aktualisieren RefreshBoundData();
Die zweite Möglichkeit verwendet Requery aber ich komme nicht zum alten Datensatz zurück.
try { // Aktuellen Datensatz aktualisieren m_piAdoRecordBinding->Update(&m_rsRecSet); // den Recordset aktualisieren m_ptrRs->Requery(adCmdUnknown); // Zeiger auf Bindungsschnittstelle des Datensatzes holen if (FAILED(m_ptrRs->QueryInterface( __uuidof(IADORecordBinding), (LPVOID *)&m_piAdoRecordBinding))) _com_issue_error(E_NOINTERFACE); // Datensatzklasse an Recordset binden m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet); // Zeiger auf die Ansicht holen POSITION pos = GetFirstViewPosition(); CAdoDatabaseView* pView = (CAdoDatabaseView*)GetNextView(pos); if (pView) // Datensatzgruppe mit Formular synchronisieren pView->RefreshBoundData(); } // Fehler vorhanden? catch (_com_error &e) { // Fehlermeldung erzeugen GenerateError(e.Error(), e.Description()); }
Hier werden die Daten zwar gespeichet, aber ich komme ich immer zurück auf den ersten Datensatz. Dies ist aber nicht meine Absicht, denn ich will ja beim alten Datensatz bleiben. Das Problem liegt, so glaube ich, bei "GetFirstViewPosition()", doch wie muss der Code aussehen, sodass ich zurück an den alten Datensatz komme.
Ich hoffe Ihr könnt mir sagen, ob das mit der 1 Möglichkeit so geht bzw. wie die 2 Möglichkeit aussehen müsste.
-
Bei ADO muss ich leider ebenfalls passen
Sorry
-
123Kobold schrieb:
Die zweite Möglichkeit verwendet Requery aber ich komme nicht zum alten Datensatz zurück.
Das ist leider normal so.
Requery lädt die Tabelle komplett neu aus der Datenbank. Damit hast du den selben Zustand wie nach Open.Nimm erstmal die erste Version und beobachte, wie zuverlässig das funktioniert.
Umbauen kannst du später ja immer noch.Schön, dass du auch alleine eine Lösung gefunden hast.