VC++ (My)ODBC

Hallo

Ich möchte mit VC++ (7.1/MFC) und MyODBC auf eine MySQL-Server zugreifen. Soweit so gut, das habe ich auch hingekriegt, bis auf die Tatsache das ich eine SYSTEM-DSN brauche. Das ODBC-Fenster springt immer auf.

CDatabase db;
CString title;
CString ODBC;
ODBC = "DRIVER={MySQL ODBC 3.51 Driver}; PORT=3306;SERVER=195.129.xxx.xxx;DATABASE=xxxxxxxx;USER=xxxxxxxxxx:stuck\_out\_tongue\_winking\_eye:WD=\*\*\*\*\*\*\*\*;OPTION=2048";

db.OpenEx(\_T(ODBC),db.noOdbcDialog);
 if (!db.IsOpen()){
 AfxMessageBox("Fehler beim Verbinden");
 }else{
 CRecordset rs;
 rs.Open(rs.forwardOnly, \_T("SELECT \* FROM `xxxxx`"));

 short nFields = rs.GetODBCFieldCount( );
 while( !rs.IsEOF( ) ){
 rs.GetFieldValue( "title", title );
 AfxMessageBox(title); //z.B

 rs.MoveNext( );
 }
 }
db.Close();

Dabei habe ich alle erforderlichen Parameter im ODBC-String drin, deshalb verstehe ich nicht, wieso er immer mit dem ODBC-Manager kommt.
voranstehendes „ODBC;“ im ODBC-String erzeugt zusätzlich einen Fehler.

Danke!

Hi,

veruche doch einfach eine SYSTEM-DNS anzulegen. Vergebe der ODBC-Verbindung einen Namen und benutze den in deinem Connectstring als Database-Parameter.

Hope this helps
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

diese Variante funktioniert, das habe ich auch schon probiert, aber ich möchte nicht noch auf jedem Rechner auf dem das Programm später laufen soll, nebst dem MyODBC-Treiber noch eine System-DSN erstellen.

Hi,

um mit den ODBC-Treibern zu arbeiten muss eine ODBC-Verbindung im System konfiguriert sein!.

Falls die Anwendung in einem Netzwerk laeuft, kann man die System-DNS auch mittels Loginscript anlegen.

Ansonsten gibt es noch die Moeglichkeit eine Installationsroutine zu schreiben, die den ODBC-Treiber installiert und anschliessend den DNS-Eintrag im System festlegt.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi, ich bin mir sicher, daß es auch ohne System-DNS geht, ist allerdings schon ne weile her, daß ich das gemacht habe. Ich hab den Connectstring folgendermaßen formatiert:

CString constr;
constr.Format("Driver={%s};Server=%s:stuck\_out\_tongue\_winking\_eye:ort=%s;Address=%s,s;
Network=DBMSSOCN;Database=%s;Uid=%s:stuck\_out\_tongue\_winking\_eye:wd=%s",
m\_strDriver, m\_strHost, m\_strPort, m\_strHost, m\_strPort,
 m\_strDatabase, m\_strUsername, m\_strPassword);

Allerdings weiß ich nicht mehr genau was für MySQL nötig war, da ich damit auf MySQL und MSSQL zugegriffen hab.Gruß Tobias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

HI, ich habs geschafft, und möchte allen, die noch eine Lösung suche meine anbieten:

include

#include 





Connection
CDatabase db;
CString subject;
CString ODBC;

CString driver;
driver = "MySQL ODBC 3.51 Driver";
CString sql ;
sql.Format ( "DRIVER={%s};SERVER=\*\*\*\*;DATABASE=\*\*\*\*;UID=\*\*\*\*:stuck\_out\_tongue\_winking\_eye:ASSWORD=\*\*\*\*;READONLY=FALSE;", driver) ;

db.OpenEx(sql,CDatabase::noOdbcDialog);
 if (!db.IsOpen()){
 AfxMessageBox("Fehler beim Verbinden");
 }else{
 CRecordset rs( &db);

 rs.Open(rs.snapshot, \_T("SELECT \* FROM ` **** `"));

 short nFields = rs.GetODBCFieldCount( );
 while( !rs.IsEOF( ) ){

 rs.GetFieldValue( "subject", subject );
 AfxMessageBox(subject);

 rs.MoveNext( );
 }
 }
db.Close();

Hoffe das hilft jemandem

Hi,

warum überhaupt über ODBC? Es gibt doch auch die C API von MySQL. Dann muss man auf dem System wo es später mal laufen soll nicht erst noch ODBC installieren sondern man muss nur die DLL (libmySQL.dll) mitkopieren und gut ist. Ist halt eine Fehlerquelle weniger im Installationsprozess :wink:

hab mal etwas Code zusammengesucht, falls es dich interessiert:
Der Code besteht aber nur aus den wichtigen Auszügen: Diese Rücksprünge bei Fehlern per return sind nicht schön…

#include

#define HOST „localhost“
#define USER „root“
#define PASSWD „“
#define DB_NAME „test“

MYSQL *mysql = NULL; // Connection handler
MYSQL_RES *result;
MYSQL_ROW row;

mysql = mysql_init(NULL);

if(mysql == NULL)
{
printf( „Init failed…\n“ );
return 1; // Init failed.
}

if(!mysql_real_connect(mysql, HOST, USER, PASSWD, DB_NAME, MYSQL_PORT, NULL, 0))
{
printf( „Connection failed…\n“ );
return 1; // Connection failed.
}

if(mysql_query(mysql, „START TRANSACTION“) != 0)
{
printf( „START TRANSACTION failed…\n“ );
return 1;
}

if(mysql_query(mysql, „SELECT * FROM test1“) != 0)
{
printf( „Select failed…\n“ );
return 1;
}

result = mysql_use_result(mysql);

//while((row = mysql_fetch_row(result)))
// printf("%s %s %s\n", row[0], row[1], row[2]);

if(mysql_errno(mysql)) // Error when fetching rows
{
printf( „Error when fetching rows…\n“ );
return 1;
}

mysql_free_result(result);

mysql_close(mysql);

Viel Spaß.

Gruß
pfanni