CDatabase-Klasse

Sircoly

Mitglied
Halli Hallo,


[FRAGE]
ich versuche grade über einen ODBC-Treiber auf meine MySQL-Datenbank zu connecten.
Habe bis jetzt folgenden Quellcode:
Code:
#include <iostream>
#include <conio.h>
#include <afxdb.h>

using namespace std;

int main()
{
	CDatabase db;
	db.OpenEx("DSN=MySQL; UID=root; PWD=test", CDatabase::noOdbcDialog);

	if(db.IsOpen() != 0)
	{
		cout << "Verbinden zu test hergestellt!" << endl;
	}
	else
	{
		cout << "Verbinden zu test fehlgeschlagen!" << endl;
	}

	db.Close( );
	getch();
}

Seht ihr irgendwo einen Fehler? - Dann sagt mir bitte bescheid. Denn ich rätsel grade,
wo diese Fehler hier herkommen
:
Code:
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (2@YAPAXI@Z) bereits in libcpd.lib(newop.obj) definiert
nafxcwd.lib(thrdcore.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__endthreadex', verwiesen in Funktion '"void __stdcall AfxEndThread(unsigned int,int)" (?AfxEndThread@@YGXIH@Z)'
nafxcwd.lib(thrdcore.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__beginthreadex', verwiesen in Funktion '"public: int __thiscall CWinThread::CreateThread(unsigned long,unsigned int,struct _SECURITY_ATTRIBUTES *)" (?CreateThread@CWinThread@@QAEHKIPAU_SECURITY_ATTRIBUTES@@@Z)'
Debug/MySQL-Projekt.exe : fatal error LNK1120: 2 unaufgelöste externe Verweise
Habt ihr eine Ahnung?


[ANTWORT]
Also... erstmal sollte der Quellcode nun fie folgt lauten:
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>


using namespace std;

int main()
{
	CDatabase TScon;
	TScon.OpenEx("DSN=SQL; UID=sa; PWD=test", CDatabase::noOdbcDialog);
	if(TScon.IsOpen() != 0)
	{
		cout << "Verbinden zu test hergestellt!" << endl;
	}
	else
	{
		cout << "Verbinden zu test fehlgeschlagen!" << endl;
	}

        TScon.Close( );
	getch();
}
Wie euch sicherlich aufgefallen ist, musste ich noch eine Include-Datei hinzufügen.(afxwin.h)
Wenn euer Projekt jetzt schon läuft, hat sich die sache erledigt und ihr müsst nichts mehr ändern.

Falls es jedoch immernoch Komplikationen gibt:
Wenn ihr euer projekt vor euch habt auf "Projekt" >> "Eigendschaften eures Projektes" gehen.
Dort findet ihr dann den Menüpunkt "Konfigurationseigenschaften" und als Unterkategorie "Allgemein".
Dort findet ihr den Punkt "Verwendung von MFC". Das stellt ihr dann auf "MFC in einer statischen Bibliothek verwenden".

Schon sollte kein Fehler mehr kommen.
 
Zuletzt bearbeitet:
Halli Hallo,

ich fange jetzt einfach einmal einen neuen Post an.
Ist ja zusätzlich auch Übersichtlicher für die Leute, die durch die Antworten die Lösung ihres Rätsels bekommen.


[FRAGE]
Jetzt habe ich hier eine Verbindung.
Ich weiß nur nicht, wie ich jetzt meine SQL-Statements(SQL-Befehle) ausführen kann.
Weiß das jemand von euch?

Ich habe leider noch keinen Quellcode, aber ich arbeite dran und versuche einen zu schreiben.
Falls ihr eine Idee habt, wie ich das machen könnte, dann postet ihn bitte hier!

So, ich habe einen Quellcode geschreiben. bei mir Funktioniert er auch.
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;

int main()
{
	CDatabase TScon;
	TScon.OpenEx("DSN=SQL; UID=sa; PWD=test", CDatabase::noOdbcDialog);
	if(TScon.IsOpen() != 0)
	{
		cout << "Verbinden zu test hergestellt!" << endl;
	}
	else
	{
		cout << "Verbinden zu test fehlgeschlagen!" << endl;
	}

	CRecordset TSrd1(&TScon);
	TSrd1.Open(CRecordset::dynaset, _T( "Select * FROM [user]" ));
	CDBVariant varValue;												// Variable, in der die Ergebnisse der Abfrage gespeichert werden. Unselektiert
	short nFields = TSrd1.GetODBCFieldCount( );							// Wie viele Einträge sind vorhanden?
	while( !TSrd1.IsEOF( ) )
	{
		for( short index = 0; index < nFields; index++ )
		{
			TSrd1.GetFieldValue( index, varValue );						// do something with varValue
		}

		TSrd1.MoveNext( );
	}

	TSrd1.Close( );
    TScon.Close( );
	getch();
}
Nur es bleibt weiterhin das Problem offen: Wie kann ich die Daten auch anzeigen lassen?



[ANTWORT]
Jaa..... nach langem suchen.... Mein Ansatz war halbwegs falsch. Ich hätte die Ergebnisse in einer Variable speichern müssen.
Und genau das tut das nächste Programm. Und zum Schluss lasse ich die Variablen einfach nur ausgeben.

Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;

int main()
{
	CString str_user_ID;
	CString str_user_Vorname;
	CString str_user_Nachname;
	CString str_user_Password;

	CDatabase TScon;
	TScon.OpenEx("DSN=SQL; UID=sa; PWD=test", CDatabase::noOdbcDialog);
	if(TScon.IsOpen() != 0)
	{
		cout << "Verbinden zu test hergestellt!" << endl;
	}
	else
	{
		cout << "Verbinden zu test fehlgeschlagen!" << endl;
	}

	CRecordset TSrd1(&TScon);
	TSrd1.Open(CRecordset::dynaset, _T( "Select * FROM [user]" ));
	//Ergebnisse in Liste schreiben
	do
	{
	//Felder auslesen
	TSrd1.GetFieldValue("user_ID", str_user_ID);
	TSrd1.GetFieldValue("user_Vorname", str_user_Vorname);
	TSrd1.GetFieldValue("user_Nachname", str_user_Nachname);
	TSrd1.GetFieldValue("user_Password", str_user_Password);

	//Daten in Liste schreiben
	cout << str_user_ID + " " + str_user_Vorname + " " + str_user_Nachname + " " + str_user_Password;

	//Nächster Datensatz
	TSrd1.MoveNext();

	} while (!TSrd1.IsEOF());

	TSrd1.Close( );
    TScon.Close( );
	getch();
}
Falls ich irgendwann einmal Zeit habe werde ich auch kommentare zu den Quellcodes schreiben.
 
Zuletzt bearbeitet:
Halli Hallo,


[FRAGE]
Jetzt haben wir die Verbindung zu unserer Datenbank UND eine Ausgabe des Inhaltes.
Jetzt wollen wir mal einen neuen Datensatz hinzufügen.

Nur wie geht das? - Hat jemand eine Ahnung? - So helft mir doch bitte.
Ich suche inzwischen auch mal nach einer Lösung.

[ANTWORT]
Eigendlich ganz einfach.
Man muss einfach nur den SQL-Befehl ausführen. Dies macht man mit folgenden Script:
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;

int main()
{
	CString SetReactionSQL = "INSERT ....... '";

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

	SetReactionConnection.ExecuteSQL( SetReactionSQL );

	SetReactionConnection.Close();
getch();
}
 
Zuletzt bearbeitet:
Halli Hallo,

[FRAGE]
Wie macht man das eigendlich, dass man z.B. einen Vornamen einer Person eingibt,
und dann wird in der Datenbank nach einer Person gesucht, die mit dem Vornamen darin steht?
Also: Wie kann ich mit eine Benutzerdefinierte Eingabe in der Datenbank suchen?
Denn das Problem ist: char-Variablen können nicht einfach so in eine CString-variable hinzuaddiert werden.

Das ist mein Versuch:
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;

int main()
{
	/***** Variablen Deklarieren *****/
	char eingabe;
	CString bedingung;
	CString str_user_ID;
	CString str_user_Vorname;
	CString str_user_Nachname;
	CString str_user_Password;

	/********************************************** Verbindungsaufbau **********************************************/
	CDatabase TScon;
	TScon.OpenEx("DSN=SQL; UID=sa; PWD=test", CDatabase::noOdbcDialog);								// Connection-Daten: DSN(MySQL), UID(root), PWD(test)
	if(TScon.IsOpen() == 0)
	{
		cout << "Die Verbindung zur Datenbank konnte nicht hergestellt werden!" << endl;			// Ausgabe: Verbindung nicht hergestellt
	}
	else
		system("cls");																				// Bildschirm löschen
    /********************************************** Verbindungsaufbau **********************************************/

	/*********************************************** Abfrage des SQL ***********************************************/
	cin >> eingabe;
	bedingung = eingabe;

	CString sql = "SELECT * FROM [user] WHERE [user].user_Vorname = '" + bedingung + "'";			// <<<<<<<<<<<<<<<<<----------- HIER ?


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

	// if(

	TSrd1.GetFieldValue("user_ID", str_user_ID);																// 
	TSrd1.GetFieldValue("user_Vorname", str_user_Vorname);														// Zuweisung
	TSrd1.GetFieldValue("user_Nachname", str_user_Nachname);													//
	TSrd1.GetFieldValue("user_Password", str_user_Password);													//

	//Daten in Liste schreiben
	cout << str_user_ID + " " + str_user_Vorname + " " + str_user_Nachname + " " + str_user_Password + "\n";	// Ausgabe der Ergebnisse
	/*********************************************** Abfrage des SQL ***********************************************/

	TSrd1.Close( );
    TScon.Close( );
	getch();
}
Wie könnte ich das Realisieren?


[ANTWORT]
Die ist ganz einfach *g* - Man nehme mein altes Script von oben.
Wenn man sich dann die Eigenschaften der abhängigen Variablen anschaut:
Code:
char eingabe;
CString bedingung;
CString sql = "SELECT * FROM [user] WHERE [user].user_Vorname = '" + bedingung + "'";
sieht man, dass ich nur eine 'char'-Variable verwende.
'char' ist aber nur dafür gedacht dass man "Einen" Buchstaben speichert.
(Falls man mehrere Buchstaben hintereinander eingibt sieht er diese zeichenkette als "Einen" Buchstaben an.)
Aber in Array's kann man Zeichenketten speichern. Denn dort wird dann jedes Zeichen in einem
Speicherblock gespeichert.
Und wenn man dies dann tut, läuft auch unser Script.

Hier mal der Fertige Code:
Code:
#include <afxwin.h>
#include <afxdb.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>


using namespace std;

int main()
{
	/***** Variablen Deklarieren *****/
	char eingabe;
	CString bedingung;
	CString str_user_ID;
	CString str_user_Vorname;
	CString str_user_Nachname;
	CString str_user_Password;

	/********************************************** Verbindungsaufbau **********************************************/
	CDatabase TScon;
	TScon.OpenEx("DSN=SQL; UID=sa; PWD=test", CDatabase::noOdbcDialog);								// Connection-Daten: DSN(MySQL), UID(root), PWD(test)
	if(TScon.IsOpen() == 0)
	{
		cout << "Die Verbindung zur Datenbank konnte nicht hergestellt werden!" << endl;			// Ausgabe: Verbindung nicht hergestellt
	}
	else
		system("cls");																				// Bildschirm löschen
    /********************************************** Verbindungsaufbau **********************************************/

	/*********************************************** Abfrage des SQL ***********************************************/
	cin >> eingabe;
	bedingung = eingabe;

	CString sql = "SELECT * FROM [user] WHERE [user].user_Vorname = '" + bedingung + "'";		


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

	// if(

	TSrd1.GetFieldValue("user_ID", str_user_ID);																// 
	TSrd1.GetFieldValue("user_Vorname", str_user_Vorname);														// Zuweisung
	TSrd1.GetFieldValue("user_Nachname", str_user_Nachname);													//
	TSrd1.GetFieldValue("user_Password", str_user_Password);													//

	//Daten in Liste schreiben
	cout << str_user_ID + " " + str_user_Vorname + " " + str_user_Nachname + " " + str_user_Password + "\n";	// Ausgabe der Ergebnisse
	/*********************************************** Abfrage des SQL ***********************************************/

	TSrd1.Close( );
    TScon.Close( );
	getch();
}
 
Hallo,


Wie euch sicherlich aufgefallen ist, musste ich noch eine Include-Datei hinzufügen.(afxwin.h)
Wenn euer Projekt jetzt schon läuft, hat sich die sache erledigt und ihr müsst nichts mehr ändern.

Falls es jedoch immernoch Komplikationen gibt:
Wenn ihr euer projekt vor euch habt auf "Projekt" >> "Eigendschaften eures Projektes" gehen.
Dort findet ihr dann den Menüpunkt "Konfigurationseigenschaften" und als Unterkategorie "Allgemein".
Dort findet ihr den Punkt "Verwendung von MFC". Das stellt ihr dann auf "MFC in einer statischen Bibliothek verwenden".

Schon sollte kein Fehler mehr kommen.

...Das ist "FAST" richtig, denn man sollte stehts darauf achten, dass die MFC-Header.h Dateien ganz oben stehen. Sollte man diese in der stdafx.h lagern, auch da darauf achten das sie immer ganz oben stehen, vor den Standartbibliotheken, sonst kann das Problem auftreten obwohl man alles beachtet hat.

Aber saugeniales Tut bin wirklich sehr sehr Dankbar.

Liebe Grüße,

Asmo. :)
 
und was kann man machen wenn man alles was ihr geschrieben habt beachtet hat aber die fehlermeldung bekommt

ORA-01460: unimplemented or unreasonable conversion requested
 
Code:
void CACS400App::OnOracleverbindung() 
{
	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
	CDatabase dbCon;
	
	dbCon.OpenEx("DSN=ArgusDB; UID=system; PWD=passwort", CDatabase::noOdbcDialog);
	if(dbCon.IsOpen() != 0)	{
		AfxMessageBox("Connect");
	}else{
		AfxMessageBox("NOT Connect");
	}
		
	CRecordset rs(&dbCon);
	rs.Open(CRecordset::dynaset, _T( "Select * FROM test" ));
	CString str_ID;
	CString str_Name;

	do{
		//Felder auslesen
		rs.GetFieldValue("ID", str_ID);
		rs.GetFieldValue("NAME", str_Name);

		//Daten in Liste schreiben
		

		//Nächster Datensatz
		rs.MoveNext();

	} while (!rs.IsEOF());	
	rs.Close();		
	dbCon.Close();
}

problem tritt in der zeile auf wo das select steht ...
"rs.Open(CRecordset::dynaset, _T( "Select * FROM test" ));"
 
Hi.

ORA-01460 ist ein Oracle Fehler. Evtl. hast du den Oracle ODBC Treiber nicht richtig oder den falschen eingebunden.

Da solltest du mal in einem Oracle Forum nachfragen.

Gruß
 
hmmm ich weis das es ein ora fehler ist ...
nur die verbindung mit der datenbank funktioniert ja ...
und ora forum ... tzzz da gibt es kein vernünftiges auf deutsch zumindestens hab ich noch keins gefunden ...
 

Neue Beiträge

Zurück