CRecordset Update Problem
-
hallo,
ich habe ein kleines problem.
habe ein programm geschrieben welches ein flugbuchungssystem darstellen soll. es funktioniert eigentlich alles bis auf ein update statement. kompilieren und so tut er, nur genau dann wenn er dieses statment ausführt dann kommt folgender fehler: Debug Assertion Failed!
hier der komplette code und wie gesagt es funktioniert alles nur bei dem update statement da is was faul.
#include "stdafx.h"
#include "test.h"
#include <conio.h>
#include <iostream>
#include "afxwin.h"
#include "afxdb.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// Das einzige Anwendungsobjekt
CWinApp theApp;
using namespace std;
void show_flight(CDatabase &db);
int main()
{CDatabase db;
// verbindung mit DB herstellen
db.OpenEx("DSN=Postgres; UID=postgres; PWD=030386", CDatabase::noOdbcDialog);// zeige alle flüge
show_flight(db);char eingabe, eingabereihe, eingabeplatz;
CString start, end, bedingung, bedingungreihe, bedingungplatz;
CString reihe, platz;
CString besetzt;cout << "Geben Sie den zu buchenden Flug ein (Flugnummer): ";
cin >> eingabe;
bedingung=eingabe;CRecordset anfrage(&db);
anfrage.Open(CRecordset::dynaset, _T( "Select * FROM [flug], [besetzung] where [flug].id = [besetzung].flugid and [flug].id = '" + bedingung + "' order by reihe, platz" ));anfrage.GetFieldValue("start", start);
anfrage.GetFieldValue("end", end);system("cls");
cout << endl << "Ausgewählter Flug" << endl << endl;
cout << "Von: \t" + start << endl;
cout << "Nach: \t" + end << endl << endl;do
{
anfrage.GetFieldValue("reihe", reihe);
anfrage.GetFieldValue("platz", platz);
anfrage.GetFieldValue("besetzt", besetzt);cout << "Reihe: " + reihe + " | Platz: " + platz + " \t | besetzt: " + besetzt << endl;
anfrage.MoveNext();
} while (!anfrage.IsEOF());
cout << endl << "Wo wollen Sie sitzen?" << endl << "Reihe (1-5): ";
cin >> eingabereihe;
bedingungreihe=eingabereihe;
cout << "Platz (1-5): ";
cin >> eingabeplatz;
bedingungplatz=eingabeplatz;anfrage.Close();
CRecordset anfrage1(&db);
anfrage1.Open(CRecordset::dynaset, _T( "Update [besetzung] set [besetzung].besetzt = 'true' where [besetzung].reihe = '" + bedingungreihe + "' and [besetzung].platz = '" + bedingungplatz + "' and [besetzung].flugid = '" + bedingung + "' " ));
anfrage1.Close();
db.Close( );
getch();
}void show_flight(CDatabase &db)
{
CString str_id;
CString str_start;
CString str_end;// jetzt wird anfrage gestellt
CRecordset anfrage(&db);
anfrage.Open(CRecordset::dynaset, _T( "Select * FROM [flug]" ));
// Felder auslesen
do
{
//Felder auslesen
anfrage.GetFieldValue("id", str_id);
anfrage.GetFieldValue("start", str_start);
anfrage.GetFieldValue("end", str_end);//Daten in Liste schreiben
cout << "Flug: " + str_id + " | Von: " + str_start + " \t | Nach: " + str_end << endl;//Nächster Datensatz
anfrage.MoveNext();} while (!anfrage.IsEOF());
cout << endl;
anfrage.Close();
}
-
Du bist aber sicher, dass der Datensatz, der upgedatet werden soll vorher auch mit CRecordSet::AddNew() angelegt wurde???
-
ne hab ich nicht... das ist mein erstes mal, dass ich auf ner datenbank mit mfc draufzugreife. kannst du mir helfen? was muss ich machen?
-
Wenn es den Datensatz nicht gibt, macht die Datenbank eben kein Update. Deswegen stürzt das Programm nicht ab. Daher würde ich den Fehler woanders vermuten.
Ich meine mich ganz dunkel zu erinnern, dass man beim Open nur SELECT-Anweisungen mitschicken kann, aber kein INSERT oder UPDATE, aber da kann ich auch gerade komplett falsch liegen.
Vielleicht mal einen Leerstring statt dem Update mitschicken (oder ein SELECT * FROM Tabellenname) um zu gucken, ob der Rest funktioniert...
-
funktioniert alles. du hast recht man kann kein update und insert durchführen. hab ich nun auch woanders nachgelesen, nur wie mache ich das jetzt? hat jemand ne ahnung oder kann mich auf einer quelle verweisen?
-
Schau mal hier rein: http://www.willemer.de/informatik/db/odbcmfc.htm
-
hm hab mir das durchgelesen aber ich werd einfach nich schlau draus wie man dann nach einer bestimmten zeile suche. ich möchte ja folgendes updaten.
es soll in der spalte besetzt ein true gesetzt werden wenn reihe=5 and platz=5 and flugid=1
wie suche ich dann nach genau dieser zeile?
-
1. bau Deinen Filterstring und packe ihn nach rs.m_strFilter
2. rufe rs.Open() mit zweitem Parameter NULL
3. wenn rs.IsEOF() dann wurde nichts gefunden, ansonsten kannst Du
4. Werte aus rs rausholen