Datenbankeintrag editieren
-
Hallo,
ich bin dabei eine Benutzerverwaltung zu programmieren, aber ich komme nicht dahinter wo man Fehler ist. Ich kann die Einträge leider nicht editieren. In einem anderen Kontext wiederum funktioniert esIch will das Passwort eines Benutzers ändern. Um das zu machen, suche ich als erstes den Benutzer in der Datenbank und prüfe dann ob das Passwort in der Datenbank mit dem eingegeben Passwort übereinstimmt, um es dann zu ändern.
Ein kleiner Auschnitt meines Codes:
CMyRecSetUser *m_RecSet; m_RecSet = new CMyRecSetUser(); m_RecSet->SetDatabase(Pfad); m_RecSet->SetQuery("SELECT Name, Passwort FROM User WHERE Name='"+ m_IText+"'"); m_RecSet->GetFieldValue("Name", tmpName); m_RecSet->GetFieldValue("Passwort", tmpPW); if (tmpPW == m_AltPW) { //Passwort wird geändert <--- FEHLER! m_RecSet->m_strFilter = (CString) "Passwort = '" + m_NewPW + "'"; m_RecSet->Requery(); m_RecSet->editPosPW(m_NewPW); MessageBox("Das Passwort wurde geändert", MB_OK); } else MessageBox("Das Passwort stimmt nicht überein.", MB_OK); m_RecSet->Close(); delete m_RecSet;
Ich kann es zwar compilieren, doch wenn ich es ausführen will bekomme ich folgende Fehlermeldung -> Syntaxfehler (fehlender Operator) in Abfrageausdruck "Name='myname' WHERE Passwort='mypw'"
In meiner editPosPW Methode steht folgendes:
void CMyRecSetUser::editPosPW(CString pw) { MoveFirst(); Edit(); m_PW = pw; Update(); }
Wenn ich einen Filter setzte dann bezieht der sich nicht auf meine vorher gesetzte Query, oder? Habe auch schon versucht ein neues Recordset anzulegen und das dort zu ändern, leider geht das auch nicht. In einem anderen Kontext wiederum kann ich Einträge editieren.
Kann mir jemand helfen und weiß wo mein Fehler liegt?
Ach noch eine kleiner Frage, ich kann doch sooft die Query aufrufen wie ich will, bräuchte demnach keinen Filter, da der Filter ja nur die WHERE klausel meines SELECT befehls ist?
Danke im Voraus!
~Zanerva
-
also was ich glaube wo deine Fehler sind: als erstes mal, wenn du ' machst solltest du davor \ machen also wehere Name = \'. Dann verstehe ich nicht warum du nach dem PW filterst, denn wenn ich irgendein PW von nem anderen User eingebe, dann editiere ich dem seins. sprich du solltest vielleicht eher nach dem Namen Filtern und dann das PW editieren.
-
Wo issn das Open() ? Wenn es nicht in SetDatabase(Pfad) mit drin ist, hast du keins...
-
Polofreak schrieb:
also was ich glaube wo deine Fehler sind: als erstes mal, wenn du ' machst solltest du davor \ machen also wehere Name = \'. Dann verstehe ich nicht warum du nach dem PW filterst, denn wenn ich irgendein PW von nem anderen User eingebe, dann editiere ich dem seins. sprich du solltest vielleicht eher nach dem Namen Filtern und dann das PW editieren.
m_RecSet->m_strFilter = (CString) "Passwort = \'" + m_NewPW + "\'";
Das verursacht leider den selben Fehler.
In meiner ersten Query suche ich nach der Zeile wo der Name m_IText entspricht. Deswegen auch meine obrige Frage ob sich der Filter auf die Query bezieht? Und ob man wirklich immer einen Filter braucht, oder ob man sooft die Query aufrufen kann wie man will?
Wenn ich die Zeile mit dem Filter rauslösche, bekomme ich eine Fehlermeldung "Ungültiger Deskriptorindix", wie ich hier per Suchfunktion erfahren habe, ein Fehler ist, der Auftritt wenn man beispielsweise versucht in die 0te Zeile zu springen (Access beginnt bei 1) Seltsamerweise rufe ich in der Edit MoveFirst auf...isabeau schrieb:
Wo issn das Open() ? Wenn es nicht in SetDatabase(Pfad) mit drin ist, hast du keins...
Natürlich, wie du schon richtig vermutet hast befindet sich die Open Methode in der SetDatabase. Lesen und Schreiben funktioniert ja, nur das editieren in dem Fall bereitet mir Sorgen
Hat jemand noch eine andere Idee?
Notfalls werde ich dann nämlich alle Werte des Users in Variblen speichern, aus der Datenbank löschen, das Paasswort editieren und dann alles nochmal reinschreiben[EDIT] Polo, du bist ein engel !!!
Es funktioniertHab die eine Zeile übersehen und so editiert wie du gesagt hast, mein code sieht jetzt folgendermaßen aus:
CMyRecSetUser *m_RecSet; m_RecSet = new CMyRecSetUser(); m_RecSet->SetDatabase(Pfad); m_RecSet->SetQuery("SELECT * FROM User WHERE Name=\'"+ m_IText+"\'"); m_RecSet->GetFieldValue("Name", tmpName); m_RecSet->GetFieldValue("Passwort", tmpPW); if (tmpPW == m_AltPW) { //Passwort wird geändert m_RecSet->editPosPW(m_NewPW); MessageBox("Das Passwort wurde geändert", MB_OK); } else MessageBox("Das Passwort stimmt nicht überein.", MB_OK); m_RecSet->Close(); delete m_RecSet;
Und es funktioniert !
Vielen Dank nochmal, wäre nett wenn du mir vielleicht meine obrigen Fragen noch beantworten könntest
Liebe Grüße,
Zanerva
-
freut mich riesig für dich!
Als ich deinen Post gelesen hab, besonders dein Edit sah ich so aus!Also nun zu deinen Fragen. Ich bin mir nicht 100%ig sicher, aber soviel ich weiß, sind die Filter die du über m_strFilter hinzufügst nichts anderes als where Bedingungen die zu deiner open Query HINZUGEFÜGT werden. Ich hatte auch schon Probleme damit. Bei mir war ein einfaches order by in der open, was mir meine Probleme gemacht hat. Aufgrund dessen solltest du entweder bei der händischen SQL-Query bleiben ODER mit strFilter und sort arbeiten.
Wenn du deine Query erneut aufrufen willst, kannst du einfach requery machen, und er fragt dir deine Daten neu ab.
Und nun nochmal zum ungültigen Deskriptor Index. Auch damit hab ich mich schon rum geschlagen, und wenn ich nicht ganz falsch liege, dann bedeutet das nicht dass du in ne falsche Zeile gesprungen bist, sondern es bedeutet dass du versucht hast eine Zahl (Datentyp in der DB = Zahl) mit ' oder " gesendet hast also '987' oder eben das Gegenteil du hast einen String (Text) ohne ' oder " gesendet.
Ich hoffe ich hab dir nun ein bischen Klarheit gebracht, wenn nicht keine Scheu zeigen einfach nochmal fragen.
mfg de Polo
-
Ok, thx a lot, für die Antwort.
Es freut mich, dass du dich über meinen Post zu amüsieren scheinst
Liebe Grüße,
~Zanerva
-
amüsieren ist falsch eher sehr erfreuen!
Mein grinsen ist halt kein 0815 grinsen
-
narf... ich komme nicht mehr weiter...
Ich will eine zufällige Frage aus einer Datenbank auslesen mit einem bestimmten Typ und den zugehörigen Antworten. Ich habe es zwar geschafft, das die Fragen zufällig anzeigt wurden (zufälliger Primärschlüssel ID), leider bekam ich auch einen wunderschönen Error wenn ich in eine zufällige Zeile hüpfte, die den zuvor genannten Typ nicht besaß. Dies wollte ich jetzt mit einer while Schleife umgehen, nur das er mir jetzt keine einzige Frage mehr ausliest, dass Programm nach der Fehlermeldung abstürzt und ich nicht in der Lage bin den Fehler zu finden...
CString tmpFrage, tmpAntwort1, tmpAntwort2, tmpAntwort3; CString testTyp; int nTyp; bool allesok=false; char buffer[20]; unsigned int index=0; CString Pfad(getVerz()); CMyRecSetFragen *m_RecSetF; m_RecSetF = new CMyRecSetFragen(); m_RecSetF->SetDatabase(Pfad); while(allesok==false) { //Zufallszahl srand((unsigned)time( NULL )); index = (rand() % MAXFRAGEN) + 1; _itoa( index, buffer, 10 ); m_RecSetF->SetQuery((CString) "SELECT * FROM Fragen WHERE ID="+buffer+" "); m_RecSetF->Requery(); m_RecSetF->GetFieldValue("Typ", testTyp); nTyp = atoi(testTyp); if (nTyp==1) { m_RecSetF->SetQuery((CString) "SELECT * FROM Fragen WHERE ID="+buffer+" AND Typ=1 "); m_RecSetF->Requery(); allesok=true; } } m_RecSetF->GetFieldValue("Frage", tmpFrage); m_RecSetF->GetFieldValue("Antwort1", tmpAntwort1); m_RecSetF->GetFieldValue("Antwort2", tmpAntwort2); m_RecSetF->GetFieldValue("Antwort3", tmpAntwort3); m_RecSetF->Close(); delete m_RecSetF;
Ohne while und nur mit
m_RecSetF->SetQuery((CString) "SELECT * FROM Fragen WHERE ID="+buffer+" AND Typ=1 ");
hat das zwar funktioniert, aber es kam, verständlicherweise immer eine Fehlermeldung, wenn die zufällige Zeile einen anderen Typ hatte.
Weiß jemand Rat? Würde mich über jeden Denkansatz wirklich freuen.
-
Wenn dein
m_RecSetF->SetQuery((CString) "SELECT * FROM Fragen WHERE ID="+buffer+" AND Typ=1 ");
nix findet, darfst du auch nix auslesen. Probier mal ein
if(!m_RecSetF->IsEOF()) { m_RecSetF->GetFieldValue("Frage", tmpFrage); m_RecSetF->GetFieldValue("Antwort1", tmpAntwort1); m_RecSetF->GetFieldValue("Antwort2", tmpAntwort2); m_RecSetF->GetFieldValue("Antwort3", tmpAntwort3); m_RecSetF->Close(); allesok=true; }
-
Das ist nett von dir isabeau, aber leider funktioniert das nicht ganz so wie ich es haben will. Es ist klar, dass wenn er nichts findet, auch nichts aulesen kann, aber um das zu umgehen, habe ich ja die while schleife, die solange läuft bis was passendes gefunden wurde. So viel zur theorie, praktisch funktionierts leider nicht...
... und ich finde beim besten Willen meinen Fehler nicht.
-
Hat niemand eine Idee?