CDBVariant

Radhad

Erfahrenes Mitglied
Hallo zusammen,

ich versuche mittels C/C++ und CDatabase sowie CRecordset MySQL-Tabellen auszulesen. Allerdings weiß ich nicht, wie ich mein varValue vom Typ CDBVariant prüfen kann, welchen Datentyp sie enthaält. Kann mir da jemand bei weiterhelfen?

Hier mal das Programm:
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;


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

	/***** Variablen Deklarieren *****/

	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=";

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

	
		CRecordset rs(&db);
		rs.Open(rs.forwardOnly, _T( "SELECT * FROM user" ));

		CDBVariant varValue;

		int n = rs.GetODBCFieldCount();
		int i = 0;
		cout << "Rows: " << n << endl;
		while( !rs.IsEOF() )
		{
			for(i = 0; i < n; i++)
			{
				rs.GetFieldValue(i, varValue);
				cout << varValue.m_iVal << endl;
			}
			cout << "Columns: " << i << endl;
			rs.MoveNext();
		}
		rs.Close();
	}
	db.Close();
	getch();
	fflush(stdin);
}

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 InsertString = "INSERT INTO user (username, vorname, nachname) VALUES ('" + Username + "', '" + Vorname + "', '" + Nachname + "')";

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

	db.ExecuteSQL( InsertString );

	db.Close();
}

void main()
{
	int eingabe;
	do
	{
		system("cls");
		cout << "[1] Daten lesen" << endl;
		cout << "[2] Datensatz schreiben" << endl;
		cout << "[0] Ende" << endl;
		cout << "Auswahl: ";
		cin >> eingabe;
		fflush(stdin);

		switch(eingabe)
		{
		case 1:
			read();
			break;
		case 2:
			write();
			break;
		default:
			system("cls");
		}
	}while(eingabe != 0);
}
Gruß Radhad

Nachtrag:
Integer lässt sich mit varValue.m_iVal und ist dwType 4 - varchar wäre dwType 8, aber ich kann es nicht mit varValue.m_pstring auslesen ^^
 
Zuletzt bearbeitet:
Ich habe das Problem gefunden.
Code:
//funktioniert nicht:
cout << *varValue.m_pstring << endl;

//funktioniert:
cout << varValue.m_pstring->GetBuffer(1) << endl;
Hier nochmal meine komplette Lösung - dafür habe ich jetzt gut 2 Monate gebraucht!
Dies ist für jeden gut, der sein Programm mit C++ oder MFC zu einer MySQL Datenbank verbinden möchte.
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;


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

	CString ODBC;

	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); // Connection-Daten: DSN(MySQL), UID(root), PWD(test)
	if(db.IsOpen() == 0)
	{
		cout << "Die Verbindung zur Datenbank konnte nicht hergestellt werden!" << endl; // Ausgabe: Verbindung nicht hergestellt
	}
	else
	{
		CRecordset rs(&db);
		rs.Open(rs.forwardOnly, _T( "SELECT * FROM user" ));

		CDBVariant varValue;

		int n = rs.GetODBCFieldCount();
		int i = 0;
		int count = 0;

		while( !rs.IsEOF() )
		{
			count++;
			for(i = 0; i < n; i++)
			{
				rs.GetFieldValue(i, varValue, DEFAULT_FIELD_TYPE);
				
				switch(varValue.m_dwType)
				{
				case DBVT_NULL:
					cout << "NULL" << endl;
					break;
				case DBVT_BOOL:
					cout << varValue.m_boolVal << "\t";
					break;
				case DBVT_UCHAR:
					cout << varValue.m_chVal << "\t";
					break;
				case DBVT_SHORT:
					cout << varValue.m_iVal << "\t";
					break;
				case DBVT_LONG:
					cout << varValue.m_lVal << "\t";
					break;
				case DBVT_SINGLE:
					cout << varValue.m_fltVal << "\t";
					break;
				case DBVT_DOUBLE:
					cout << varValue.m_dblVal << "\t";
					break;
				case DBVT_DATE :
					cout << varValue.m_pdate << "\t";
					break;
				case DBVT_STRING:
					cout << varValue.m_pstring->GetBuffer(1) << "\t";
					break;
				case DBVT_BINARY:
					cout << varValue.m_pbinary << "\t";
					break;
				default:
					break;
				}
			
				varValue.Clear();
			}
			cout << endl;
			rs.MoveNext();
		}
		rs.Close();
		cout << endl << "-----------" << endl << "Rows: " << count << endl;
		cout << "Columns: " << n << endl << "Weiter ";
	}
	db.Close();
	getch();
	fflush(stdin);
}

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 InsertString = "INSERT INTO user (username, vorname, nachname) VALUES ('" + Username + "', '" + Vorname + "', '" + Nachname + "')";

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

	db.ExecuteSQL( InsertString );

	db.Close();
}

void main()
{
	int eingabe;

	do
	{
		system("cls");
		cout << "[1] Daten lesen" << endl;
		cout << "[2] Datensatz schreiben" << endl;
		cout << "[0] Ende" << endl;
		cout << "Auswahl: ";
		cin >> eingabe;
		fflush(stdin);

		switch(eingabe)
		{
		case 1:
			read();
			break;
		case 2:
			write();
			break;
		default:
			system("cls");
		}
	}
	while(eingabe != 0);
}
Gruß Radhad
 
Zurück