Mysql C++ Problem



  • Hallo,

    Folgender Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <time.h>
    #include <stdio.h>
    #include <stdio.h>
    #include <mysql/mysql.h>
    
    using namespace std;
    
    void mysql (string host, string user, string password)
    {
    	MYSQL mysql;
    	char sql_buffer [50000];
    
    	if (mysql_init(&mysql) == NULL)
    	{
    		cout << "Mysql could not be initialized: Are you using mysql.h?" << endl;
    		exit(1);
    	}
    	/* struct mysql, host, user, password, database, port(0=standard 3306), unix_socket(stream/raw...), clientflags(z.b. compress) */
      	if(!mysql_real_connect(&mysql, host.c_str(), user.c_str(), password.c_str(), NULL, 0, NULL, 0))
    	{
    		cout << "I can't log into the database" << endl;
    		exit(1);
    	}
    
       	cout << "Using mysql client version: " << mysql_get_client_info() << endl;
    	cout << "Using mysql server version: " << mysql_get_server_info(&mysql) << endl;
    
     	strcpy (sql_buffer, "SHOW DATABASES");
       	mysql_exec_sql(&mysql, sql_buffer);
      	mysql_close(&mysql);
    }
    
    int main (int argc, char* argv[])
    {
    	mysql ("localhost", "user", "password");
    }
    

    Terminiert beim kompilieren mit folgendem Fehler:

    mysql.c: In function »void mysql(std::string, std::string, std::string)«:
    mysql.c:33: Fehler: »mysql_exec_sql« wurde in diesem Gültigkeitsbereich nicht definiert

    Verbindung usw passt, nur das mysql_exec_sql() scheint er nicht zu kennen.

    strcpy (sql_buffer, "SHOW DATABASES");

    War am Anfang ebenfalls:

    strmov (sql_buffer, "SHOW DATABASES");

    Aber strmov() hat er ebenfalls nicht gekannt

    Fehlt mir eine Include?
    Oder was ist der Fehler?

    Danke für die Hilfen



  • Umgebaut habe ich ihn jetzt auf diesen Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <time.h>
    #include <stdio.h>
    #include <stdio.h>
    
    #include <mysql/mysql.h>
    
    using namespace std;
    
    void mysql (string host, string user, string password)
    {
    	MYSQL mysql;
    	char sql_buffer [50000];
    	char buffer	[50000];
    	bool result;
    
    	if (mysql_init(&mysql) == NULL)
    	{
    		cout << "Mysql could not be initialized: Are you using mysql.h?" << endl;
    		exit(1);
    	}
    	/* struct mysql, host, user, password, database, port(0=standard 3306), unix_socket(stream/raw...), clientflags(z.b. compress) */
      	if(!mysql_real_connect(&mysql, host.c_str(), user.c_str(), password.c_str(), NULL, 0, NULL, 0))
    	{
    		cout << "I can't log into the database" << endl;
    		exit(1);
    	}
    
       	cout << "Using mysql client version: " << mysql_get_client_info() << endl;
    	cout << "Using mysql server version: " << mysql_get_server_info(&mysql) << endl;
    
     	strcpy (sql_buffer, "SHOW DATABASES");
       	if (mysql_query(&mysql, sql_buffer))
    	{
    		perror("Fatal");
    		exit(1);
    	}
    
    	if (!(result = mysql_store_result(&mysql)))
        	{
           		perror("Fatal");
    		exit(1);
        	}
    
    	if (!(buffer = mysql_fetch_row(result)))
        	{
            	perror("Fatal");
    		exit(1);
        	}
      /* 
    
        	for (unsigned int colNum = 0; colNum <= nrFields(); colNum++)
        	{
            	field[colNum] = fetchbuffer[colNum];
        	}*/
    
      	mysql_close(&mysql);
    }
    
    int main (int argc, char* argv[])
    {
    	mysql ("localhost", "user", "pass");
    }
    

    Fehler: »bool« kann nicht nach »MYSQL_RES*« für Argument »1« nach »char** mysql_fetch_row(MYSQL_RES*)« umgewandelt werden

    Ich bin mir hier nicht ganz sicher was für eine Variable erwartet wird.
    MYSQL_RES sagt mir jetzt nicht viel?
    Danke für die hilfe!



  • #include <iostream>
    #include <fstream>
    #include <string>
    #include <time.h>
    #include <stdio.h>
    #include <stdio.h>
    
    #include <mysql/mysql.h>
    
    using namespace std;
    
    void mysql (string host, string user, string password)
    {
    	MYSQL_ROW fetchbuffer;
    	char* field[100];
    
        	MYSQL *conn;
        	MYSQL_RES *result; 
    	string sqlcommando = "SHOW DATABASES";
    
    	conn = mysql_init(NULL);
    
        	if (conn == NULL) 
    		perror ("Fatal");
    
        	if (mysql_real_connect(conn, host.c_str(), user.c_str(), password.c_str(), NULL, 0, NULL, 0) == NULL)
        	{
            	perror ("Fatal");
        	}  
    	result = NULL;
    
    	if (mysql_query(conn, sqlcommando.c_str()))
        	{
    		cout << "error " <<endl;
        	}
    
       	if (!(result = mysql_store_result(conn)))
       	{
            	/*  Statement executed */
            	cout << "ok " << endl;
        	}
    
    	if (!(fetchbuffer = mysql_fetch_row(result)))
    	{
    		/*  Keine Daten vorhanden */
    		cout << "empty " << endl;
    	}
    
        	for (unsigned int colNum = 0; colNum <= 10; colNum++)
        	{
            	field[colNum] = fetchbuffer[colNum];
       	}
    
    }
    
    int main (int argc, char* argv[])
    {
    	mysql ("localhost", "user", "pass");
    }
    

    So 🙂
    cout << field[0] <<endl;
    ergibt
    information_scheme

    aber wenn ich an der stelle 1 oder 2 oder 3 ... eine ausgabe mache bekomme ich entweder keine werte oder einen seg fault!

    Ich habe aber 12 Datenbanken im System, also müssten field[0]-[11] eig. Werte haben?

    Bitte um schnelle Hilfe - geht um ein Firmaprojekt!
    Danke 🙂



  • Wenn Du 12 Datenbanken hast wirst Du 12 Rows erhalten. Du holst aber nur eine Row. Die Fields sind die Spalten der einzelnen Rows.

    Ach ja, mit die Anzahl der Felder kann man auch herausfinden, bevor man ins Nirvana greift und einen Segfault riskiert. Die Funktion dafür weiss ich aber nicht auswendig.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum Datenbanken verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten