Problem mit 2 SQL-Statements

Buba235

Erfahrenes Mitglied
Hallo!


Ich hab da ein Problem mit meinem Programm. Es gibt zwei SQL-Statements, die ausgeführt werden müssten. Das eine Statement schreibst den Inhalt einer erzeugten Datei in die Datenbank (was auch super klappt) und das zweite sollte mir (in einer Schleife die Datei nochmal durchgehen und wenn die If erfüllt, dann in die Datenbank schreiben) das auch machen. Leider führt mein Programm nur den ersten SQL-Befehl aus.

Hier mal der Code:

Code:
/*Includes*/
#include <stdio.h>
#include <mysql.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>


/*Defines*/
#define LINE_SIZE 4096


/*Prototypen*/
int connect_DB();
char* mystrtok(char*, char);
void close_conect(MYSQL*);
void writeInDatabase(MYSQL*);
void strings_ausgeben(const char*);
void errorHandler();


/*globale Variablen*/
extern int errno;


/*----------------------------------------------------------------------------*/
/*Hauptfunktion main startet das Programm*/
int main(int argc, char *argv[]) {

        /*Variablen*/
        int i;
        const char *path;


        /*Argumente pruefen*/
        for(i = 0; i < argc; i++) {
                if (argc < 2) {
                        perror("Zu wenig Argumente(!Pfad fehlt!)");
                        errorHandler();
                }
        }

        /*path auf das erste Argument nach Programmnamen setzen...*/
        path = argv[1];
        /*...und den Pfad dann uebergeben*/
        strings_ausgeben(path);

        /*Aufruf der restlichen Funktionen*/
        connect_DB();

        return 0;
}/*Ende der Funktion main*/


/*----------------------------------------------------------------------------*/
/*Funktion um das Programm im Fehlerfall zu beenden*/
void errorHandler() {

        exit(EXIT_FAILURE);
}/*Ende der Funktion errorHandler*/


/*----------------------------------------------------------------------------*/
/*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",
                                "MyDB",
                                3306,
                                NULL,
                                0) == NULL) {
                fprintf(stderr, "Fehler mysql_real_connect(): "
                        "%u (%s)\n", mysql_errno(conn), mysql_error(conn));
                errorHandler();
        }

        /*Funktionsaufrufe*/
        writeInDatabase(conn);   /*Eintrag der Daten in Datenbank*/
        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*/


/*----------------------------------------------------------------------------*/
/*Hier wird die Zeichenkette ermittelt, die spaeter auch in die Datenbank
  eingetragen werden soll (Zeile fuer Zeile)*/
void strings_ausgeben(const char *path) {

        /*Variablen*/
        int i;
        FILE *super;
        FILE *datei;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *pfadzuSuper;
        pfadzuSuper = "/home/tracer/wlan_DB/alert_files/super.txt";

        /*Datei anlegen*/
        super = fopen(pfadzuSuper, "wt");
        if (super == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Schreiben(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Datei zum Lesen oeffnen*/
        datei = fopen(path, "rt");
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Auslesen(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Jede Zeile durchgehen und immer den, in Token zerlegten String, einlesen*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = mystrtok(buffer, gelesene_Kommas);
                for(i = 0; word != NULL; i++) {
                        if (i == 12) {
                                /*Das Eingelesene wird in die Datei
                                  super.txt geschrieben*/
                                fprintf(super, "%s\n", word);
                                break;
                        }
                        word = mystrtok(NULL, gelesene_Kommas);
                }
        }


        /*Datei schliessen*/
        fclose(datei);
        fclose(super);
}/*Ende der Funktion datei_ausgeben*/


/*----------------------------------------------------------------------------*/
/*Diese Funktion uebernimmt die Aufgabe der C-eigenen Funktion strtok()
  Mit der C-eigenen Funktion wurden leere Teile zwischen den Kommas
  ueberlesen und der naechste Wert wurde ausgegeben. Diese Funktion
  arbeitet sauberer*/
char* mystrtok(char *s, char delim) {

        /*Variablen*/
        char *curr = NULL;
        char *ret = NULL;
        static char *buffer = NULL;

        if (s) {
                buffer = s;
        }

        curr = buffer;

        if (curr) {
                /*Einzelne Characters durchgehen solange bis Komma
                  oder ein \0 Zeichen*/
                while(*curr != delim && *curr != '\0') {
                        curr++;
                }

                if (*curr == '\0') {
                        return NULL;
                }

                *curr = '\0';
                ret = buffer;
                buffer = curr + 1;
        }

        return ret;
}/*Ende der Funktion mystrtok*/


/*----------------------------------------------------------------------------*/
/*Diese Funktion schreibt den Inhalt der Datei in die Datenbank*/
void writeInDatabase(MYSQL *conn) {

        /*Variablen*/
        const char *sql;
        int i;
        FILE *datei;
        char line[LINE_SIZE];
        char *delim = "\0";
        char *word = NULL;
        char *path;
        const char *sqltext;

        sqltext = "INSERT INTO test (DST_NAME) VALUES ('T-Mobile')";

        path = "/home/tracer/wlan_DB/alert_files/super.txt";

        /*Datei oeffnen mit Fehlerabfrage*/
        datei = fopen(path, "rt");
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei(Funktion check_name) ");
                errorHandler();
        }

        /*SQL-Befehl*/
        sql = "LOAD DATA LOCAL INFILE \
        '/home/tracer/wlan_DB/alert_files/super.txt' \
                        INTO TABLE test \
                        LINES TERMINATED BY '\n' \
                        (SRC_NAME)";

        /*Daten des Files in die Tabelle schreiben*/
        mysql_query(conn, sql);

        /*Fehlerabfrage*/
        if (sql != 0) {
                fprintf(stderr, "%s\n", mysql_error(conn));
                fprintf(stderr, "%s\n", sql);
                errorHandler();
        }

        HIER scheint er nicht rein zu laufen - WARUM?
        while(fgets(line, LINE_SIZE, datei) != NULL) {
                word = strtok(line, delim);
                for(i = 0; word != NULL; i++) {
                        if (*word == 'N') {
                                fprintf(stderr, "%s\n", "Hallo");
                                mysql_query(conn, sqltext);

                                /*Fehlerabfrage*/
                                if (sqltext != 0) {
                                        fprintf(stderr, "%s\n", mysql_error(conn));
                                        fprintf(stderr, "%s\n", sqltext);
                                        errorHandler();
                                }
                                break;
                        }
                        word = strtok(NULL, delim);
                }
        }

        /*Datei wieder schliessen*/
        fclose(datei);
}/*Ende der Funktion writeInDatabase*/


/*----------------------------------------------------------------------------*/
/*Funktionsbeschreibung*/


Vielleicht kann mir jemand sagen wo der Fehler liegt. Ich hab schon so einiges versucht, aber nichts führte zu einem Ergebnis! Ich hab die Stelle (von der ich glaube, dass sie der Fehler ist) markiert. Schon mal danke im Vorraus für euere Antworten!
 
Ich weiß der Code ist verwirrend, aber ich hab noch ne Frage: Ist es überhaupt möglich mehrere verschiedene SQL-Befehle in einem Programm auszuführen? Irgendwie zweifle ich mittlerweile daran. Ich bin weiter am Testen und probieren, aber ich komme einfach auf keinen grünen Zweig!
 
Hallo!

Nochmal zum allgemeinen Verständnis: Ich versuche in diesem Code:

Code:
while(fgets(line, LINE_SIZE, datei) != NULL) {
                word = strtok(line, delim);
                for(i = 0; word != NULL; i++) {
                        if (*word == 'N') {
                                /*Ist nur da um zu sehen ob was passiert*/
                                fprintf(stderr, "%s\n", "Hallo");
                                mysql_query(conn, sqltext);

                                /*Fehlerabfrage*/
                                if (sqltext != 0) {
                                        fprintf(stderr, "%s\n", mysql_error(conn));
                                        fprintf(stderr, "%s\n", sqltext);
                                        errorHandler();
                                }
                                break;
                        }
                        word = strtok(NULL, delim);
                }
        }

zu vergleichen, ob in der Datenbank ein bestimmtes Zeichen am Wortanfang (noch besser wäre natürlich das ganze Wort) vorkommt. Wenn ja, dann soll in dieser Zeile in der Datenbanktabelle etwas eingetragen werden. Ungefähr so:

Tabelle:
Spalte 1 | Spalte 2 | Spalte 3 | Spalte n
Hans Hallo
Egon
Hans Hallo

Also immer wenn Hans erscheint soll Hallo in Spalte 3 eingetragen werden. Nur das Problem an der ganzen Sache ist, dass nur mein erstes SQL-Statement ausgeführt wird und dann diese Abfrage ^ völlig außer Acht gelassen wird. Habt ihr vielleicht eine andere Idee wie das zu lösen wäre?
 
Hallo,

habe ich das richtig verstanden wenn Spalte1 = Hans dann Spalte2 = Hallo

Wenn das so ist würde ich folgendes SQL Statement absetzen

Update Tablename
Set Spalte2 = hallo
where Spalte1 = hans
 
Hallo!

Sorry hab mich da unverständlich ausgedrückt! Wenn der INHALT von Spalte 1 Hans ist, dann soll der INHALT von Spalte 2 Hallo sein.
Also in meinem Programm wird das, was in die Datei geschrieben wird in die Datenbank eingetragen. Wenn er damit fertig ist, soll er die Datei nochmal durchgehen und immer wenn ein bestimmter String (in meinem Fall ist es noch ein Zeichen) auftaucht, soll er in eine Andere Spalte eben Hallo eintragen!
 
Okay ich hab jetzt rausgefunden, dass meine while-Schleife nicht ausgeführt wurde, weil dieser Teil im Code das verhindert hat:

Code:
if (sql != 0) {
                fprintf(stderr, "%s\n", mysql_error(conn));
                fprintf(stderr, "%s\n", sql);
                errorHandler();
        }

Warum weiß ich allerdings nicht! Mein Problem ist jetzt, dass er den zweiten SQL-Befehl immer noch nicht ausführt. Er rennt nur in das while rein und gibt mir Hallo auf stderr aus. Aber warum?

Code:
while(fgets(line, LINE_SIZE, datei) != NULL) {
                word = strtok(line, delim);
                for(i = 0; word != NULL; i++) {
                        if (*word == 'N') {
                                /*Ist nur da um zu sehen ob was passiert*/
                                fprintf(stderr, "%s\n", "Hallo");
                                mysql_query(conn, sqltext);
                                break;
                        }
                        word = strtok(NULL, delim);
                }
        }
 
Zuletzt bearbeitet:
Hallo,

aber nichts anderes macht doch der Update Befehl wenn du nur auf der DB die Sachen
geändert haben willst und nicht in deiner textdatei. Durch den Update Befehl werden alle Zeilen geändert in welchen der Name Hans steht. Wenn du das von bestimmten Zeichen am Anfang abhängig machen willst dann kannst du auch mit Suffix in der where Klausel arbeiten!

Ich hoffe ich habe dein Problem richtig verstanden, oder ich stehe völlig auf dem Schlauch aber deiner Beschreibung nach sollen sich alle Zeilen in Spalte2 ändern welche in Spalte1 einen bestimmten Wert haben.

Grüße
R.
 
Hallo!


Du hattest recht! Der SQL-Befehl war das Problem! Meiner war falsch und deiner richtig! Es funktioniert! Danke, danke, danke!

Gruß
Buba
 
Zurück