(In C) Daten aus einer Datenbank in Textdatei importieren



  • Hallo Leute!

    Ich hab vor einiger Zeit mal eine Frage gehabt wie ich Daten aus einem Textfile in eine Datenbank schreiben kann. Jetzt hab ich den umgekehrten Fall und weiß nicht mehr weiter. entweder ich bin zu doof oder ich hab nur ein Brett vorm Kopf. Also hier mal mein Code:

    /*Includes*/
    #include <stdio.h>
    #include <mysql.h>
    #include <stdlib.h>
    
    /*Prototypen*/
    int connect_DB();
    void close_conect(MYSQL*);
    void create_file(MYSQL*);
    
    int main(int argc, char *argv[]) {
    
            /*Aufruf der Funktionen*/
            connect_DB();
    
            return 0;
    }/*Ende der Funktion main*/
    
    /*----------------------------------------------------------------------------*/
    /*Diese Funktion stellt eine Verbindung zur Datenbank (Alarmmanager) her*/
    int connect_DB() {
    
            /*Variablen*/
            MYSQL *conn;        /*Fuer Verbindung benoetigt*/
    
            /*Verbindungsaufbau zum MySQL-Server mit Fehlerabfrage*/
            conn = mysql_init(NULL);
            if (mysql_real_connect( conn,
                                    "2.9.153.47",
                                    "root",
                                    "root",
                                    "wlan",
                                    3306,
                                    NULL,
                                    0) == NULL) {
                    fprintf(stderr, "Fehler mysql_real_connect(): "
                            "%u (%s)\n", mysql_errno(conn), mysql_error(conn));
                    exit(EXIT_FAILURE);
            }
    
            /*Funktionsaufrufe*/
            create_file(conn);              /*Datei erstellen und Daten hinein schreiben*/
            close_conect(conn);     /*DB-Verbindung schliessen*/
    
            return 0;
    }/*Ende der Funktion connect_DB*/
    
    /*----------------------------------------------------------------------------*/
    /*Mit Hilfe dieser Funktion wird die Verbindung zur Datenbank wieder
      geschlossen und der belegte Speicher wird frei gegeben*/
    void close_conect(MYSQL *mysql) {
            mysql_close(mysql);
    }/*Ende der Funktion close_conect*/
    
    /*----------------------------------------------------------------------------*/
    /*Ueber diese Funktion wird eine Datei erstellt und mit dem Inhalt der Tabelle
      trace_data gefuellt*/
    void create_file(MYSQL *conn) {
            FILE *datei;
    
            datei = fopen("/home/tracer/wlan_DB/file_writer/test.txt", "w+");
            /*Fehlerabfrage*/
            if (datei == NULL) {
                    fprintf(stderr, "Fehler beim erstellen der Datei\n");
            }
    
            /*Inhalt der Tabelle trace_data in Datei schreiben*/
            const char *sql = "SELECT * INTO OUTFILE '/home/tracer/wlan_DB/file_writer/test.txt' \
                               FIELDS TERMINATED BY',' LINES TERMINATED BY '\n' \
                               FROM trace_data";
    
            fwrite(sql, sizeof(char), sizeof(sql), datei);
    
            /*Datei schliessen*/
            close(datei);
    
    }/*Ende der Funktion create_file*/
    

    So wie ich den Code geschrieben habe schreibt er mir nur den Inhalt des Strings von *sql in die Datei. Ich will aber den Inhalt der Datenbanktabelle in der Datei stehen haben. Was mach ich falsch? Hat da jemand eine Lösung?



  • Brauch da echt dringend Hilfe! Kenn mich einfach nicht aus damit! Wie geht das denn?



  • Du solltest die SQL-Anfrage an den Server schicken und das Ergebnis in die Datei schreiben. 🙄

    (Anfrage zur DB schicken hast Du anscheinend schonmal gemacht sonst wäre da jetzt keine Datei drin 😉 )



  • Hallo!

    Nein das habe ich noch nicht gemacht! Ich habe die Datei ganz normal mit fopen erzeugt. Oder meintest du das? Ich hab aber keine Ahnung wie das geht was du mir da beschrieben hast! Kannst du mir da bitte ein Beispiel geben?



  • Naja dazu musst Du in der API für MySQL nachschauen, mit der habe ich mich noch nicht beschäftigt. Du hast dort bisher nur einen Befehl zusammengesetzt, das ist als würdest Du in eine Bank gehen, "Pack das ganze Geld in eine Tüte" auf einen Zettel schreiben, den in die Hosentasche stecken und wieder gehen.

    Mit "hast Du schonmal gemacht" meinte ich das Verschicken von Daten an MySQL, da ich aufgrund des folgenden Satzes

    Ich hab vor einiger Zeit mal eine Frage gehabt wie ich Daten aus einem Textfile in eine Datenbank schreiben kann.

    einfach angenommen habe dass Du diese Frage auch lösen konntest (anders gesagt, wenn Du noch nie was an die DB geschickt hast, was willst Du dann rausholen?).



  • Naja ich hab mal von einer vorhandenen Textdatei den Inhalt in eine Tabelle gechickt. Jetzt möchte ich von einer ganz anderen Tabelle den Inhalt auslesen und in eine Textdatei schreiben, die ich erst erstelle! Mein Problem ist nur dass ich nicht checke welchen Befehl ich nehmen muss um den von mir gebastelten SQL-String in meine Textdatei zu schreiben. Das was ich schaffe (und das ist ja nicht das was ich machen möchte) ist, dass dann in meiner Datei einfach nur SELECT * ... steht. Also der String selber aber nicht der Inhalt des Strings!
    Da steh ich eben vor einem Rätsel!



  • "SELECT * FROM ..." ist der Inhalt des Strings. Ist doch klar dass Du wenn Du den an eine Datei schickst genau die Buchstaben in der Datei hast, was würdest Du auch sonst erwarten? Dass die Standardbibliothek denkt "och, der String fängt mit SELECT an, das ist bestimmt ein SQL-Befehl und achja, eben habe ich doch eine MySQL-Verbindung aufgemacht. Da schicke ich den Befehl jetzt mal hin, statt in die Datei" 😕

    Wie hast Du damals die Textdatei in die Datenbank bekommen? Du hast doch bestimmt irgendwie (tm) einen String in der Art "INSERT INTO ... SET text='ganz_viele_daten'" zusammengezimmert und den an MySQL geschickt, oder? Genau diesen Befehl, nämlich das an MySQL schicken, musst Du mit Deinem String wiederholen. Die Funktion dafür heisst mit Sicherheit mysql_query oder so, aber da schau wie gesagt in der API-Beschreibung von MySQL. Dort steht auch drin wie Du das Ergebnis verwertest.



  • Hallo!

    Also ich habe jetzt folgendes gemacht:

    void create_file(MYSQL *conn) { 
            FILE *datei; 
    
            datei = fopen("/home/tracer/wlan_DB/file_writer/test.txt", "w+"); 
            /*Fehlerabfrage*/ 
            if (datei == NULL) { 
                    fprintf(stderr, "Fehler beim erstellen der Datei\n"); 
            } 
    
            /*Inhalt der Tabelle trace_data in Datei schreiben*/ 
            const char *sql = "SELECT * INTO OUTFILE '/home/tracer/wlan_DB/file_writer/test.txt' \ 
                               FIELDS TERMINATED BY',' LINES TERMINATED BY '\n' \ 
                               FROM trace_data"; 
    
            [b]if (mysql_query(conn, sql)) {
                   fprintf(stderr, "%s\n", mysql_error(conn));
                   fprintf(stderr, "%s\n", sql);
            }[/b]      
    
            [b]mysql_query(conn, sql);[/b]
    
            /*Datei schliessen*/ 
            close(datei); 
    
    }/*Ende der Funktion create_file*/
    

    Jetzt kommt folgene Fehlermeldung:

    Can`t create/write to file '\home\tracer\wlan_DB\file_writer\test.txt' (Errcode: 2)

    Was hat das nun wieder zu bedeuten? Ich werd aus den Fehlererklärungen im Internet nicht schlau!



  • Oha, das INTO OUTFILE hab ich ja ganz übersehen.

    Wenn Du das so machst, erstellt die Datenbank für Dich die Datei. Da Du sie schon zum Schreiben geöffnet hast, darf MySQL das nicht mehr. Du kannst das fopen und fclose also bei Dir komplett rauswerfen.

    EDIT:
    Bzw Du musst es rauswerfen, damit MySQL die Datei erzeugen kann 😉



  • Hallo!

    Also meine Funktion schaut jetzt modifizierfter weiße so aus:

    void create_file(MYSQL *conn) { 
            const char *sql;
    
            /*Inhalt der Tabelle trace_data in Datei schreiben*/ 
            sql = "SELECT * INTO OUTFILE '/home/tracer/wlan_DB/file_writer/test.txt' \ 
                               FIELDS TERMINATED BY',' LINES TERMINATED BY '\n' \ 
                               FROM trace_data"; 
    
            mysql_query(conn, sql);
    
    }/*Ende der Funktion create_file*/
    

    Es kommt aber immer noch dieser Errorcode 2! Was hat das zu bedeuten?



  • Okay ich habs gecheckt! Es liegt daran dass ich keine Datei in meinem Verzeichnis mit dem Befehl "...INTO OUTFILE..." erzeugen kann! Muss mal nach einer anderen Möglichkeit schauen!


Anmelden zum Antworten