Problem mit MySQL Funktion in C Programm



  • Hallo!

    Ich versuche gerade eine Funktion zu schreiben, die auf eine MySQL DB zugreift und das Ergebnis ausgibt. Als Argument erwartet die Funktion eine SQL Abfrage (SELECT name FROM testtable WHERE arg = 1).
    Das Ergebnis (Ein Textstring/Wort) soll am besten in eine Variable/string geschrieben werden und returned werden.
    Wahrscheinlich gibt es Probleme mit den Datentypen.
    Wenn ich die Funktion aufrufe bekomme ich einen Segmentation Fault Fehler.

    char* mysqlcommand(const char queryvar[100]) 
    { 
      MYSQL *conn; 
      MYSQL_RES *result; 
      MYSQL_ROW row; 
    
      char *server = "localhost"; 
      char *user = "root"; 
      char *password = "pwd"; 
      char *database = "dbase"; 
    
      conn = mysql_init(NULL); 
    
      mysql_real_connect(conn, server, user, password, database, 0, NULL, 0); 
    
      mysql_query(conn, queryvar); 
    
      result = mysql_use_result(conn); 
    
      while ((row = mysql_fetch_row(result)) != NULL) 
      sprintf(binputvar1, "%s", row[0]); 
    
      return binputvar1; 
    
      mysql_free_result(result); 
      mysql_close(conn); 
    
    }
    

    So rufe ich die Funktion in meinem Programm auf:

    mysqlcommand("SELECT name FROM testtable WHERE arg = 1");

    Wo sind die Fehler? Ich hoffe, ich habe nichts vergessen.

    Vielen Dank für eure Hilfe!

    PS: Ich programmiere noch nicht soo lange. Habt Mitleid :p



  • was für ein Typ hat die Variable binputvar1?

    Außerdem überschreibst du den alten Inhalt bei jeder iteration der while-schleife.

    Außerdem solltest du mysql_free_result und mysql_close vor dem return ausführen, denn sonst bleibt bei jedem Aufuruf von mysqlcommand eine Verbindung offen.



  • supertux schrieb:

    was für ein Typ hat die Variable binputvar1?

    Außerdem überschreibst du den alten Inhalt bei jeder iteration der while-schleife.

    Außerdem solltest du mysql_free_result und mysql_close vor dem return ausführen, denn sonst bleibt bei jedem Aufuruf von mysqlcommand eine Verbindung offen.

    Ich habe die Variablen so definiert (global):

    char* binputvar1[20];
    char* binputvar2[20];
    char* binputvar3[20];
    char* binputvar4[20];
    char* binputvar5[20];
    

    Statt der While Schleife ist eine if- Anweisung wahrscheinlich passender. Da ich ja mehr als eine Variable beschreiben will, habe ich mir das so vorgestellt:

    if ((row = mysql_fetch_row(result)) != NULL)
    	{
    	  sprintf(binputvar1, "%s", row[0]);
    	  sprintf(binputvar2, "%s", row[1]);
    	  sprintf(binputvar3, "%s", row[2]);
    	  sprintf(binputvar4, "%s", row[3]);
    	  sprintf(binputvar5, "%s", row[4]);		
    	}
    

    Theoretisch sollt in jede dieser Variablen der Wert einer Zeile geschrieben werden. Oder?

    Danke.

    PS: Die return Anweisung kann ich doch eig. weglassen, oder?



  • HorstP schrieb:

    Theoretisch sollt in jede dieser Variablen der Wert einer Zeile geschrieben werden. Oder?

    Wenn

    MYSQL_ROW row;
    

    kompatibel zu

    char **
    

    ist und der fetch die Werte entsprechend splittet, dann schon.



  • MYSQL_ROW gibt die Werte als Array von Strings aus. Der MYSQL_ROW Typ beinhaltet die Werte für eine Zeile aus Daten.
    Alle Werte (auch Zahlen) werden als string zurückgeliefert.
    Das Ansprechen der Indizes (row[0], row[1],.. etc) in dem Script, sollte nicht das Problem sein.
    Auch wenn ich die Variablen als char binputvar1[20]; deklariere, gibt es noch immer einen Segmentation Fault.

    Kann mir jemand helfen und sagen wo das Problem liegt? Vielen Dank



  • HorstP schrieb:

    char* binputvar1[20];
    char* binputvar2[20];
    char* binputvar3[20];
    char* binputvar4[20];
    char* binputvar5[20];

    if ((row = mysql_fetch_row(result)) != NULL)
    {
    sprintf(binputvar1, "%s", row[0]);
    sprintf(binputvar2, "%s", row[1]);
    sprintf(binputvar3, "%s", row[2]);
    sprintf(binputvar4, "%s", row[3]);
    sprintf(binputvar5, "%s", row[4]);
    }

    muss natürlich heissen:

    char binputvar1[20];
    char binputvar2[20];
    char binputvar3[20];
    char binputvar4[20];
    char binputvar5[20];
    strcpy(binputvar1,row[0]); usw.
    


  • HorstP schrieb:

    char* binputvar1[20];
    char* binputvar2[20];
    char* binputvar3[20];
    char* binputvar4[20];
    char* binputvar5[20];
    

    aber binputvar1[0] bis binputvar1[19] sind nicht intialisieirt, wenn du versuchtst dort etwas zu schreiben, endet das ganze mit höher Wkeit in segfault.

    size_t len = strlen(row[0]);
    binputvar1[0] = malloc(1+len * sizeof *(ninputvar[0]));
    if(binputvar1[0])
        strcpy(binputvar1[0], row[0]);
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C 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.



  • Hmmmm.. Das Programm wird ohne Fehler kompiliert, doch jetzt bekomm eich als Ausgabe ein Rechteck in dem drei Nullen und eine Eins sind. Was ist das?

    Das ist mein gesamtes Programm, ich glaub ich schaffs nicht:

    #include <stdio.h>
    #include <my_global.h>
    #include <mysql.h>
    #include <string.h>
    
    char* binputvar1[50];
    char* binputvar2[50];
    char* binputvar3[50];
    char* binputvar4[50];
    char* binputvar5[50];
    
    char mysqlcommand(char queryvar[100])
    {
       MYSQL *conn;       
       MYSQL_RES *result;   
       MYSQL_ROW row;
    
       char *server = "localhost";
       char *user = "root";
       char *password = "pwd";
       char *database = "dbase";
    
       conn = mysql_init(NULL);
    
       mysql_real_connect(conn, server, user, password, database, 0, NULL, 0); 
    
       mysql_query(conn, queryvar);  
    
       result = mysql_use_result(conn);
    
       size_t len = strlen(row[0]); 
       binputvar1[0] = malloc(1+len * sizeof *(binputvar1[0])); 
    
       if(binputvar1[0]) 
         strcpy(binputvar1[0], row[0]);
    
       mysql_free_result(result);
       mysql_close(conn);
    
    }
    
    char main()
    {
    	mysqlcommand("SELECT name FROM testtable WHERE xyz = 2");
    	printf("%s\n", binputvar1[0]);
    
    	return 0;
    }
    

    Irgendwas stimmt mit den Datentypen nicht, wäre nett wenn mir nochmal wer helfen könnte! Vielen Dank



  • du übergibts an row überhaupt keine wert. außerdem darfst du die variable len nicht irgendwo mittendrin deklarieren, sondern musst das gleich am anfang erledigen. ich glaub, ich hab mal gelesen, dass das ein muss bei c ist. bin mir aber nicht ganz sicher

    ich hab selbst mal en bisschen dran rumgebastelt:

    #include <stdio.h> 
    #include <my_global.h> 
    #include <mysql.h> 
    #include <string.h> 
    
    char binputvar1[50]; 
    
    char mysqlcommand(char queryvar[100]) 
    { 
       MYSQL *conn;       
       MYSQL_RES *result;   
       MYSQL_ROW row; 
    
       char *server = "localhost"; 
       char *user = "root"; 
       char *password = "pwd"; 
       char *database = "dbase"; 
       size_t len;
    
       conn = mysql_init(NULL); 
    
       mysql_real_connect(conn, server, user, password, database, 0, NULL, 0); 
    
       mysql_query(conn, queryvar);   
    
       result = mysql_store_result(conn); 
       row = mysql_fetch_row(result);
    
       len = strlen(row); 
    
       if(binputvar1) 
         strcpy(binputvar1, row[0]); 
    
       mysql_free_result(result); 
       mysql_close(conn);
    } 
    
    int main() 
    { 
        mysqlcommand("SELECT name FROM testtable WHERE xyz = 2"); 
        printf("%s\n", binputvar1); 
        getchar();
    
        return 0; 
    }
    

    funktioniert bei mir einwandfrei. hoffe ich konnte dir helfen

    mit was programmierst du? ich benutze vs2008, da werden die fehler auch angezeigt.


Anmelden zum Antworten