Befehlsübergabe an MySQL (load data infile)



  • Hallo.

    Ich hab folgendes Problem:
    Ich will eine Textdatei in eine MySQL Datenbank über einen C++ Befehl einlesen. Der funktionierende SQL-Befehl lautet "load data infile ´PFAD´into table TABELLENNAME

    Ich kann verschiedene SQL-Befehle über Borland Builder6 absetzen (SELECT, DELETE,.....) und sie funktionieren auch 😃

    Nur der obere Befehl funktioniert komischerweise nicht 😕
    es erscheint immer eine Fehlermeldung beim Starten dieses Befehls.

    Quelltext:
    DataModule2->Query1->Close();
    DataModule2->Query1->SQL->Clear();
    DataModule2->Query1->SQL->Add("load data infile ´"c:\text.txt"%´ into table dat");
    DataModule2->Query1->Open();

    Fehlermeldung:
    Im Projekt Project.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: Állgemeiner SQL-Fehler.......

    Kennt sich da jemand aus und kann mir helfen.........

    Danke.



  • Hallo

    mir ist die Syntaxt für load data nicht ganz klar. Aber wenn du denn Dateinamen direkt so übergibst, vergiß nicht die doppelten Backslashes.

    DataModule2->Query1->SQL->Add("load data infile ´"c:\\text.txt"%´ into table dat");
    

    bis bald
    akari



  • Danke für die schnelle Antwort.

    hab ich versucht.....leider auch kein Erfolg.



  • Hallo

    ich hab mal mein SQL-Manual durchgeschaut und folgendes gefunden :

    LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;

    oder Unix-Style

    C:/tmp/skr.txt

    Da muß du die überflüssigen Sonderzeichen raushauen.

    bis bald
    akari


  • Mod

    Hallo

    das beste ist du schaust dir das im Handbuch fuer mySQl mal genau an
    (da gibt es einige Fallstricke)
    ich habe vor einiger Zeit schonmal versuchtaber nie so richtig zum Laufen gebracht
    Problem war aber bei mir das die Datei nicht auf dem Server lag sondern lokal

    MfF
    Klaus



  • Werd mal nochmal den Befehl durchschauen bzw. die Sonderzeichen 🙂

    aber der Befehl funktioniert eigentlich, d. h. wenn man in MySQL in die SQL Eingabeaufforderung geht und den Befehl so eingibt macht er alles ohne Probleme, nur über C macht er Probleme.

    Danke an alle



  • Statt "Query->Open()" "Query->ExecSQL()" nehmen, da die LOAD-Anweisung keine Rückgabemenge besitzt.

    Eine CSV-Datei in eine Tabelle laden:

    Vorraussetzung ist eine bestehende Tabelle mit den entsprechenden vordefinierten Spalten!

    Im Beispiel wird der File "C:/Dateien/import.csv" in die Tabelle "daten" der Datenbank "testdb" geladen. Alle Felder werden durch ";" getrennt und in die Spalten "id, name" usw. geladen

    LOAD DATA INFILE 'C:/Dateien/import.csv' INTO TABLE testdb.daten FIELDS TERMINATED BY ';' (id, name, wert, datum)



  • Hab es jetzt folgendermassen abgeändert, funktioniert aber leider immer noch nicht
    😞

    {
    DataModule2->Query1->Close();
    DataModule2->Query1->SQL->Clear();
    DataModule2->Query1->SQL->Add("delete from dat");
    DataModule2->Query1->SQL->Add("load data infile 'c:/mysql/Tabellen/tar.txt' into table dap.dat fields terminated by ';' lines terminated by ','");
    DataModule2->Query1->ExecSQL();
    }

    Hab ich was übersehn???????????? 😕
    Hilfe

    Dank euch 🙂



  • Kannst du mal ansatzweise Deine tar.txt zeigen? Warum machst Du das mit lines terminated by ',' ?



  • Dies ist der tar.txt bzw. ein Auszug davon:

    0258006566 ; 001 ; 312132 ; 2004-11-10 ; 14:34:10 ; 230 ; 0 ; 21 ,
    0258006566 ; 001 ; 312132 ; 2004-11-10 ; 14:32:09 ; 230 ; 0 ; 21 ,

    Diese Datei wird von einem anderen System erzeugt, deswegen habe ich nur diese Möglichkeit.



  • Also in der Zeit, die dieser Thread schon läuft, hättest Du längst eine Importroutine schreiben können... 😃


  • Mod

    Hallo

    ist diese Datei auf dem Rechner wo auch der mySQL-Server drauf ist oder
    auf dem Client

    MfG
    Klaus



  • Du solltest das in 2 Queries machen:

    [cpp]
    {
    // Tabelle kicken
    DataModule2->Query1->Close();
    DataModule2->Query1->SQL->Clear();
    DataModule2->Query1->SQL->Add("delete from dat");
    DataModule2->Query1->ExecSQL();

    // neue Daten einspielen
    DataModule2->Query1->Close();
    DataModule2->Query1->SQL->Clear();
    DataModule2->Query1->SQL->Add("load data infile 'c:/mysql/Tabellen/tar.txt' into table dap.dat fields terminated by ';' lines terminated by ',' (spalte1, spalte2, ...)");
    DataModule2->Query1->ExecSQL();
    }
    [/cpp]



  • Es hat geklappt 😃

    Vielen Dank an alle besonders an F98


Anmelden zum Antworten