MySQL mit C (Segmentation fault)???



  • Hallo allerseits,

    Da ich hier schon einmal Hilfe zu diesem Thema bekommen habe versuche ich's mal wieder. Ich habe unten im Programm folgendes Problem. Zuerst verbinde ich mich mit einer Datenbank Namens dvd_archiv. Anschließend rufe ich eine Funktion auf, welche, Daten in die Datenbank schreiben soll. Das klappt auch noch. Aber sobald die Funktion zur Rücksprungadresse hinter dem Funktionsaufruf springt, bekomme ich ein Segementation Fault. Weiss jemand woran das liegt?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #if defined(__WIN32__)
        #include <windows.h>
    #endif
    #include <mysql.h>
    
    MYSQL *my;
    
    int insert_db(char *titel, char *hauptrolle, unsigned int fsk, unsigned int gedreht)
    {
     char string[1024];
     char ins[] = { "INSERT INTO filmdaten (titel, hauptrolle, fsk, gedreht) VALUES" };
     sprintf(string, "%s (\'%s\', \'%s\', %d, %d)",ins,titel,hauptrolle,fsk,gedreht);
    
     if (mysql_query (my,  string) != 0)  
       {
           fprintf (stderr, "Fehler der Anfrage: %s\n", string);
           mysql_close (my);
           return  -1;
        }
     else
       { 
            fprintf (stdout, "INSERT Anweisung erfolgreich: %lu Zeile(n) betroffen\n",
            (unsigned long) mysql_affected_rows (my));
            return 0;
       }
    } 
    
    int main (int argc, char *argv[])
    {  
     int ret;
      /* Handle Initialisieren */
      my = mysql_init(NULL);
      if(my == NULL)
       {
         fprintf(stderr, "Allozierung oder Initialisierung fehlgeschlagen\n");
         exit (0);
       }
      /* Mit dem Server verbinden */ 
      if( mysql_real_connect(my, NULL, NULL, NULL, NULL, 0, NULL, 0) == NULL)
        {
          fprintf (stderr, "Fehler mysql_real_connect(): %u (%s)\n",
                   mysql_errno (my), mysql_error (my));
        } 
      else
          fprintf(stdout, "Erfolgreich mit dem MySQL-Server verbunden\n");
    
      mysql_query(my, "USE dvd_archiv");  
      insert_db("Triple xXx", "Vin Diesel", 18, 2003);
    
      /* Verbindung trennen */       
      mysql_close(my);
      return 0;
    }
    

    Gruß
    Jabber



  • Hi!

    Original erstellt von <Jabber>:
    **Aber sobald die Funktion zur Rücksprungadresse hinter dem Funktionsaufruf springt, bekomme ich ein Segementation Fault. Weiss jemand woran das liegt?

    [...] char ins[] = { "INSERT INTO filmdaten (titel, hauptrolle, fsk, gedreht) VALUES " }; // setz mal zwischen VALUES und " ein Leerzeichen - klappt?!
     sprintf(string, "%s (\'%s\', \'%s\', %d, %d)",ins,titel,hauptrolle,fsk,gedreht);
     [...]
       // <ot>
      insert_db("Triple xXx", "Vin Diesel", 18, 2003);
       // Du hast einen komischen Geschmack... </ot>
     [...]
    ```**
    

    cu

    P84



  • In http://www.devarticles.com/art/1/101/4
    wird mysql_query nochmal beschrieben. Bist Du sicher, dass Du mit
    mysql_query(my, "USE dvd_archiv"); einen Handle zur Datenbank erhälst?!

    Vgl. Sample-Code:

    // With all our variables declared we can begin writing our main function. The first thing we need to do is connect to our database:
    
    pConnection = mysql_init(NULL); //init the structure
    if(!pConnection) //error, quit the program 
    return 0;
    printf("Attempting Connection to MySQL\n");
    if(mysql_real_connect(pConnection,"localhost", "admin", "password", "Article1", 0, NULL, 0) == NULL) //error, quit the program 
    return 0;
    printf("Connected to the Database. Press any key to continue\n"); 
    [...]
    

    Da Du sämtliche Argument NULL bzw. 0 setzt, woher soll bei 'USE dvd_archiv' MySQL denn wissen, wo sich die DB befindet ohne DSN? 😉

    cu

    P84

    [ Dieser Beitrag wurde am 14.04.2003 um 22:26 Uhr von Prof84 editiert. ]


Anmelden zum Antworten