CRecordset Problem - MySQL

Radhad

Erfahrenes Mitglied
Hallo Zusammen,

ich versuche ein Programm zu schreiben, welches mittels ODBC auf eine MySQL Datenbank zugreifen kann. Meine write() - Funktion klappt wunderbar. Aber die read() - Funktion stürzt immer bei der Zeile "TSrd1.Open(CRecordset::dynaset, _T( sql ));". Weiß jemand, woran das liegt? Hier mal der komplette Quellcode:
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;


void read()
{
	system("cls");

	CString ODBC;
	CString UserID;
	CString Vorname;
	CString Nachname;
	CString Username;

	CDatabase db;
	ODBC = "DRIVER={MySQL ODBC 3.51 Driver};PORT=3306;SERVER=127.0.0.1;DATABASE=sample;USER=root;PWD=";

	db.OpenEx(ODBC, CDatabase::noOdbcDialog);			(MySQL), UID(root), PWD(test)
	if(db.IsOpen() == 0)
	{
		cout << "Die Verbindung zur Datenbank konnte nicht hergestellt werden!" << endl;
	}
	else
	{
		cout << "Verbindung hergestellt!" << endl << endl;

	
		CString sql = "SELECT * FROM user";		

		CRecordset TSrd1(&db);
		TSrd1.Open(CRecordset::dynaset, _T( sql ));

		do
		{
			TSrd1.GetFieldValue("userid", UserID);
			TSrd1.GetFieldValue("username", Username);
			TSrd1.GetFieldValue("firstname", Vorname);	
			TSrd1.GetFieldValue("lastname", Nachname);								
			cout << UserID + " " + Username + " " + Vorname + " " + Nachname + "\n";
		}
		while(!TSrd1.IsEOF());

		TSrd1.Close( );
	}
	db.Close( );
}

void write()
{
	system("cls");

	char username[255], vorname[255], nachname[255];
	CString Vorname;
	CString Nachname;
	CString Username;
	CString ODBC;

	cout << "Username: ";
	cin >> username;
	cout << "Vorname: ";
	cin >> vorname;
	cout << "Nachname: ";
	cin >> nachname;

	Username.Format("%s",username);
	Vorname.Format("%s",vorname);
	Nachname.Format("%s",nachname);

	ODBC = "DRIVER={MySQL ODBC 3.51 Driver};PORT=3306;SERVER=127.0.0.1;DATABASE=sample;USER=root;PWD=";

	CString SetReactionSQL = "INSERT INTO user (username, vorname, nachname) VALUES ('" + Username + "', '" + Vorname + "', '" + Nachname + "')";

 	CDatabase SetReactionConnection;
	SetReactionConnection.OpenEx(ODBC, CDatabase::noOdbcDialog);						// Connection-Daten: DSN(MySQL), UID(root), PWD(test)

	SetReactionConnection.ExecuteSQL( SetReactionSQL );

	SetReactionConnection.Close();
}

void main()
{
	int eingabe;
	do
	{
		cout << "[1] Daten lesen" << endl;
		cout << "[2] Datensatz schreiben" << endl;
		cout << "[0] Ende" << endl;
		cout << "Auswahl: ";
		cin >> eingabe;
		switch(eingabe)
		{
		case 1:
			read();
		case 2:
			write();
		default:
			system("cls");
		}
	}while(eingabe != 0);
}

Ich hoffe mir kann jemand weiterhelfen.


Gruß Radhad
 
Halli Hallo,

ich habe hier mal eine kleine "Anleitung".
Die ist bei mir irgendwann mal zustande gekommen. :-)

Vielleicht hilft Sie dir ja mal weiter.
Ansonsten: nur ein kleiner Tipp:
Am besten immer den Compiler bzw. IDe angeben, sowie den Fehler.
Macht alles einfacher.

Ich nehme mal an, dass ein Runtime-Error kommt.
Das hat damit zu tun, dass kein passender Datensatz gefunden wurde.
Bzw. du willst auf ein Element zugreifen, dass du nicht ausgewählt hast.
Zumindest ist das immer mein Fehler gewesen.

:-) :-) :-)
 
Anhand deiner Anleitung (und Tipps von einer anderen Seite) ist dieses Programm entstanden. als IDE benutze ich Visual C++ 6.0. Den MySQL ODBC Treiber in der Version 3.51 habe ich auch installiert. Datensätze sind in der Tabelle 'user' vorhanden. Einen neuen Datensatz kann ich auch erstellen. Das lesen klappt halt nicht. Vielleicht siehst du ja den Fehler, wenn du es mal kompilierst? Ich hab es als Win32 Konsolenanwendung kompiliert, und mittels ALT + F7 auf MFC mit statischer Bibliothek linken gestellt.


Gruß Radhad
 
Hallo Hallo,

ich verstehe diese Zeile nicht:
C++:
	db.OpenEx(ODBC, CDatabase::noOdbcDialog);			(MySQL), UID(root), PWD(test)
Wieso steht da "(MySQL), UID(root), PWD(test)" dahinter?

und Versuch bitte nochmal eine Abfrage. Aber verändere diese Zeile
C++:
		TSrd1.Open(CRecordset::dynaset, _T( sql ));

in diese hier:
C++:
TSrd1.Open(CRecordset::forwardOnly, sql, CRecordset::readOnly);				// SQL-Statement durchführen

Sag bescheid.
 
Zuletzt bearbeitet von einem Moderator:
Es funktioniert so auch nicht.

Das IntelliSense klappt beim CRecordset Objekt auch nicht. Ich weiß nicht woran das liegt.



Gruß Radhad
 
Halli Hallo,

sorry dass ich erst jetzt reingucke.
Hab nich so viel Zeit gehabt. Musste noch ein Projekt zuende machen.

Ich werde mich heute drum kümmern.
(Oder andere ;-) :-P)
 
Zurück