(Wieder) SQL-Befehl

Buba235

Erfahrenes Mitglied
Hallo!

Ich hab ja vor ein paar Tagen schon einmal wegen dem SQL-Befehl hier angefragt. Jetzt hab ich dazu wieder eine Frage. Ist es denn nicht möglich immer den Wert in die DB einzutragen, wenn ich die Zeilen mit durchzähle und immer bei einer neuen Zeile den Wert in die DB schreibe? Also so sieht mein Code aus:

Code:
void date(const char *path, MYSQL *conn) {

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

        /*Die vorhandene Datei super.txt loeschen*/
        if ((remove(pfadzuSuper)) < 0) {
                perror("Fehler beim Loeschen der Datei(Funktion date) ");
                errorHandler();
        }

        /*Datei aus dem Pfad zum Lesen oeffnen*/
        datei = fopen(path, "rt");
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum"
                       " Auslesen(Funktion date) ");
                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 == 0) {
                                while(fgets(puffer, 1024, datei)) {
                                        zaehler++;
                                        if (zaehler == '\n') {
                                                sprintf(sqlSub_Type, "UPDATE test "
                                                          "SET SUB_TYPE = '%s'", word);
                                                mysql_query(conn, sqlSub_Type);
                                        }
                                break;
                                }
                        }
                        word = mystrtok(NULL, gelesene_Kommas);
                }
        }

        /*Datei schliessen*/
        fclose(datei);
}/*Ende der Funktion date*/
 
Hi.

Du kannst natürlich die Zeilen der Datei als Rekord sukzessive in die Datenbank schreiben.

Allerdings, wie ich dir bereits versucht habe zu erklären, haben die Einträge in der Datenbank keine bestimmte Reihenfolge. Aus Performancegründen darf die Datenbank die Einträge speichern wo und wie es am günstigsten ist und später auch nach Belieben in der Reihenfolge verändern wenn z.B. die Datenbankdatei komprimiert bzw. optimiert wird.

Wenn du einen bestimmten Eintrag aktualisieren willst mußt du von dem Eintrag selbst sagen können aus welcher Zeile er stammt (wenn das dein einziger Schlüssel ist) - allein wenn du einen beliebigen Eintrag betrachtest. Nur dann kannst du auch den richtigen Eintrag bei einem UPDATE auswählen. Oder du kannst einen Eintrag in der DB mit dem aktuellen Datensatz aus der Datei in Übereinstimmung bringen.

Kannst du eine solche eindeutige Zuordnung nicht treffen, ist ein Update der Daten in der Datenbank nicht möglich.

Es wäre ja auch mal ganz interessant gewesen zu wissen wie die Tabelle aussieht und wie deine Daten aussehen die dann gespeichert werden.

Gruß
 
Okay mal zu der Struktur der Datei, aus der die Daten kommen. Die sieht so aus:
Request,2006-05-21,06:01:17,208.54.89.23,193.254.174.18,161,49600001.test@t-mobile.de,10.192.7.1,,06,@t-mobile.de,Request,,,,,1,01,t-mobile,us, 20038 T-Mobile HotSpot Carrollton
Natürlich mehrere Zeilen und nicht immer sind leere Kommafelder dabei. Ich muss jetzt z.B. das erste Wort hernehmen. Das kann, wie hier, Request, Accept oder Reject sein. Soweit zu der Datei. Die Struktur meiner DB:

ID, TYPE, SUB_TYPE, DATE, TIME, usw...
 
Zuletzt bearbeitet:
Aha, OK. Also konkrete Daten hätten mich jetzt nicht unbedingt interessiert, sondern auch mehr die Struktur der CSV Datei.

Aber du hast doch da in der Tabelle schon eine ID drin?! Die ID ist doch zur Identifizierung eines Datensatzes bestens geeignet. Wo kommt die denn her? Das ist doch sicherlich ein primärer Schlüssel, oder? Kannst du denn eine neue Tabelle anlegen wenn du schon die vorhandene nicht ändern darfst? Dann könntest du doch eine Zuordnung von ID -> Zeilennummer machen und so den richtigen Eintrag bestimmen.

Gruß
 
Hallo!

Ja ich kann eine neue Tabelle anlegen! Nur weiß ich nicht wie ich das in Zusammenhang mit der ID machen kann. Kannst du mir da ein Beispiel geben?
 
Wo kommt denn die ID her?

Du müßtest nur wenn du einen neuen Eintrag in die Tabelle einfügst gleich danach noch einen Eintrag in die neue Tabelle mit der Zeilennummer als primärer Schlüssel und der ID (als Fremdschlüssel) speichern. Willst du dann einen Eintrag für eine bestimmte Zeile ändern, mußt du zuvor nur die richtige ID raussuchen.

Gruß
 
Also die ID ist ein Auto increment. Er zählt also automatisch mit.
Was du da sagst klingt für mich echt logisch und überzeugend, aber wie realisiere ich das im Code? Also ich hab da nicht den leisesten Schimmer.
 
Aha. Wenn ID eine Auto Inkrement Spalte ist, dann kannst du die zuletzt erzeugte ID mit der LAST_INSERT_ID() SQL Funktion bekommen.

SQL:
INSERT INTO tab1 VALUES ...;
INSERT INTO tab2 (LINENO, ID) VALUES (<line_nr>, LAST_INSERT_ID());
Beim Aktualisieren:
SQL:
id = SELECT ID FROM tab2 WHERE LINENO = <line_nr>;
UPDATE tab1 SET SUB_TYPE = <subtype> WHERE ID = <id>;

Das ist natürlich nur ein Beispiel und du mußt das ganze in C schreiben und da die entsprechenden Platzhalter noch einsetzen.

Gruß

PS: Den ganzen Aufwand brauchst du natürlich nicht betreiben wenn die ID direkt von der Zeilenanzahl abhängt.
 
Zuletzt bearbeitet:
Hallo!

Die ID hängt von der Zeilenzahl ab! Was bedeutet das jetzt für mich? Wie kann ich dann dem Programm "sagen" dass es bei der Zeile den Wert einträgt und bei der nächsten Zeile den nächsten usw.?
 
Also wenn die Zeilennummer direkt mit der ID korrespondiert, dann seh ich nicht das Problem.

Wenn du erstmalig Daten in die Tabelle einfügst wird doch die ID jeweils um 1 inkrementiert. D.h. für jede Zeile wird ein Datensatz hinzugefügt und die ID stimmt exakt mit der Zeilennummer überein. Da mußt du doch nur beim UPDATE in der WHERE Klausel die Bedingung ID = <zeilennummer> angeben.

Gruß
 
Zurück