Einbindung einer Datenbank in eine Unteransicht
-
MSDN CREcordset::Delete() schrieb:
Caution The recordset must be updatable and there must be a valid record current in the recordset when you call Delete; otherwise, an error occurs. For example, if you delete a record but do not scroll to a new record before you call Delete again, Delete throws a CDBException.
Woher bekommst du den Inhalt deiner Abfrage?
PS: Anweisungen nach dem return sind übrigens sinnlos

-
Tja, das können 1000 Sachen sein.
Da musste mal debuggen.
-
Bei dem Debuggen kommt aber keine Meldung.
-
Zum Debuggen guck mal ins Magazin wie man das angeht.
Der Debugger schmeißt dir die Lösung in den seltensten Fällen schön zurechtgelegt und ausformuliert vor die Füße.
-
Warning: no listbox item selected.,
Warning: ODBC Success With Info, Fehler bei SQLSetConnectAttr-Aufruf für Treiber
und
Error: must enter Edit or AddNew mode before updating.das sind die Zeilen, die mir der Debugger anzeigt.
Ich hoffe, dass mir jemand helfen kann.

-
Bartnelke schrieb:
Error: must enter Edit or AddNew mode before updating.
Bartnelke schrieb:
void Dozent2::OnBnClickedLoeschen() { CTabelle1 m_TabelleDozent; m_TabelleDozent.Open(); if (m_TabelleDozent.IsBOF()) { // Das Recordset ist leer } else { // Vorne anfangen m_TabelleDozent.MoveFirst(); while(!m_TabelleDozent.IsEOF()) { // Stimmt die Kombination? if (m_TabelleDozent.m_Name == m_Vorlesender) { m_TabelleDozent.Delete(); // Diese Zeile löschen // return true;// Fertig und raus } m_TabelleDozent.MoveNext(); // Weiter }} if (!m_TabelleDozent.Update()) { return; AfxMessageBox(_T("Es wurde nicht gelöscht.")); } }Also, ich denke mal die Meldung kommt in Zeile 26.
Und zwar nur, wenn er NICHT in Zeile 19 vorbeigekommen ist.Salopp gesagt: Was soll ich hier updaten, ich hab doch nix gelöscht.

-
Und wie kann ich das Problem lösen???
Danke.
-
Och, also langsam komme ich mir komisch vor...

Du sortierst entweder deinen Code um - oder du machst ne bool Variable, die du setzt, wenn gelöscht wurde und prüfst die verher.
-
Sorry, aber manchmal stehe ich bei dem Programm auf dem Schlauch...
Ich füge mal den geänderten Code ein.
Er löscht immer noch nicht.void Dozent2::OnBnClickedLoeschen() { CTabelle1 m_TabelleDozent; m_TabelleDozent.Open(); if (m_TabelleDozent.IsBOF()) { // Das Recordset ist leer } else { // Vorne anfangen m_TabelleDozent.MoveFirst(); while(!m_TabelleDozent.IsEOF()) { // Stimmt die Kombination? if (m_TabelleDozent.m_Name == m_Vorlesender) { m_TabelleDozent.Delete(); // Diese Zeile löschen if (!m_TabelleDozent.Update()) { AfxMessageBox(_T("Es wurde nicht gelöscht.")); return; } } m_TabelleDozent.MoveNext(); // Weiter }} }Wäre schön, wenn ihr mir weiterhelfen könnt.
-
1. Nutze bitte ab jetzt Code-Tags.
2. Ist dein Code immer so unformatiert und chaotisch?
Markier den Code mal und drück Atl+F8.
Bei so einem Durcheinander muss man ja den Durchblick verlieren. :p
3. Setz bitte mal einen Breakpoint in Zeile 17 und schau dir dort für JEDEN Durchlauf die Inhalte von m_TabelleDozent.m_Name und m_Vorlesender an.
Sind die jemals gleich? Werden die Zeilen 19 bis 24 überhaupt durchlaufen?
-
Erster Blick in MSDN sagt:
Unlike AddNew and Edit, a call to Delete is not followed by a call to Update.
-
isabeau schrieb:
Erster Blick in MSDN sagt:
Unlike AddNew and Edit, a call to Delete is not followed by a call to Update.Ups, danke.

Wieso hat der bei mir noch nie gemeckert?
-
Auch wenn es jetzt ne ganz banale Frage ist:
Wenn ich auf ein Element in einer Listbox klicke, nimmt dann meine Variable automatisch den Wert an???
Für den Breakpoint muss ich keine Bedingung einfügen, oder???Danke.
-
Bartnelke schrieb:
Für den Breakpoint muss ich keine Bedingung einfügen, oder?
Nein, einfach nur gucken was in den Variablen steht.
Damit beantwortet sich dann auch deine erste Frage, denke ich.Steht nicht das erwartete in m_Vorlesender, dann weißt du, wieso es nicht klappt.

-
Also bei Data steht gar nichts drin.
Und wie kann man das ändern???Danke.
-
Data? Meinst du, der String ist leer?

-
Zumindest wird nichts im Bereich Data angezeigt,
was ich schon etwas komisch finde.
Wenn ich statt der Zeile:
if (m_TabelleDozent.m_Name == m_Vorlesender)
diese dastehen habe:
if (m_TabelleDozent.m_Name = m_Vorlesender)
löscht er nach der Reihenfolge in der Datenbank.
-
Also, wenn dich das wirklich wundert, dann gebe ich hiermit auf.

-
Wenn ein = steht, dann wird der Wert der entsprechenden Variable zugewiesen.
Beim == werden die Werte verglichen.Ich vertausche das bloß öfters, beziehungsweise vergesse das.
Sorry...Es wird mir aber auch keine Daten im Bereich Data angezeigt, wenn ich einen ganz speziellen Datensatz herausnehme. Dann klappt das Löschen schon,muss aber zwischen durch noch eine andere Ansicht aufmachen, ehe die Listbox aktualisiert wird.
-
Bartnelke schrieb:
Wenn ein = steht, dann wird der Wert der entsprechenden Variable zugewiesen.
Und es ist true, falls es in einer Bedingung steht.
Beim == werden die Werte verglichen.
Ich vertausche das bloß öfters, beziehungsweise vergesse das.
Sorry...Ist ne böse Fehlerquelle, sieht zu, dass es seltener wird.

Es wird mir aber auch keine Daten im Bereich Data angezeigt, wenn ich einen ganz speziellen Datensatz herausnehme. Dann klappt das Löschen schon,muss aber zwischen durch noch eine andere Ansicht aufmachen, ehe die Listbox aktualisiert wird.
Naja, die Listbox wird in dem Code, den ich kenne ja auch nicht aktualisiert. Das musst du noch machen.
Leider weiß ich immer noch nicht, was du mit Data meinst.
