ADO Query "INSERT INTO" Syntaxfehler Hilfe



  • Hallo, bekomme für folgenden Query eine Fehlermeldung, dabei ist es doch simpel:

    adoqu_leer->SQL->Add("INSERT INTO tb_ftp SET bezeichnung='leer' ");
    

    Die Verbindung zur DB steht, sonst würde ja bestimmt eine andere Fehlermeldung kommen.

    Die Tabelle und die spalte sind auch so richtiggeschrieben groß/klein blabla.

    es soll einfach nur in die spalte "bezeichnung" "leer" eingetragen werden.

    Das muss doch so gehen, auch ohne Values und ParamByName oder?

    Gruß
    Thorsten



  • Hallo

    deine SQL-Syntax scheint in Ordung zu sein.
    Was für eine Fehlermeldung genau kommt denn ?
    Sind Tabellenname und Feldname richtig?
    Ist adoqu_leer->SQL vor dem ->Add leer?
    Führst du das Kommando mit ->ExecSQL() anstatt mit ->Open()?

    bis bald
    akari



  • ich nehme Exec... ist leer bzw. noch nichts drinn und namen sind richtig



  • Hallo

    und die Fehlermeldung?
    ansonsten kann ich dich nur mal auf
    http://dev.mysql.com/doc/mysql/de/handler.html
    verweisen.

    bis bald
    akari



  • Im Projekt mymp3s.exe ist eine Execption der Klasse EOleExecption aufgetreten. Meldung: 'Syntaxfehler in der INSERT INTO Anweisung '. Pozeß mit einzelnen blabla fortsetzten.

    das ist die fehlermeldung



  • Hallo

    okay, dein Datenbankdienst (sicher Paradox/ODBC) scheint nicht die Syntax wie MySQL zu unterstützen. Probier mal die in dem von mir geposteten Link anderen 2 angegeben Möglichkeiten aus, oder such dir mal ein passende Syntax-Übersicht zu deinen Dienst.
    Bei mir klappt jedenfalls die Syntax.

    bis bald
    akari



  • ok, hab es jetzt so gemacht (Provider ist übrigens Microsoft.Jet.OLEDB.4.0)

    adoqu_leer->SQL->Add("INSERT INTO tb_ftp (bezeichnung) VALUES('leer')");
    

    zwar doof aber es geht.

    das mache ich ja nur, damit ich bei einer leeren tabelle eine zeile reinbekommen, da mir das programm beim schließen sonst fehlermeldung ausspuckt, BOF oder EOF oder Datensatz wurde gelöscht. Nun habe ich zwar kurz zuvor eine erstellt, dennnoch meint er beim schließen, "BOF ...". Wenn dann was drinn steht, wird das programm ordnungsgemäß geschlossen. wie kann ich ihm nun zeigen, das da ein datensatz drin ist, nachdem ich ihn eingefügt habe?

    gute nacht bis moin



  • Hallo

    Irgendwie kommt mir das sehr komisch vor.
    Kann es sein, das du mit dem INSERT nur an Symptomen rumdokterst?

    das mache ich ja nur, damit ich bei einer leeren tabelle eine zeile reinbekommen, da mir das programm beim schließen sonst fehlermeldung ausspuckt

    Diese Fehlermeldung solltest du eben umgehen. Warum wird denn beim Schließen des Programms auf die Tabelle zugegriffen, und wenn das notwenig ist, warum fängst du nicht vorher ab, wenn kein Datensatz vorhanden ist?

    bis bald
    akari



  • Dann frage ich vlt. mal ab, wie ich das abfangen kann. wenn ich im close ereignis der form form frage "IsEmpty()" dann kann ich zwr ne eigene fehlermeldung machen etc. es wird trotzdem die fehlermeldung hochkommen? dann frag ich vlt. mal ganz doof.. wie kann ich so eine fehlermeldung denn richtig abfangen??

    danke schonmal
    gruß
    thorsten



  • Hallo

    zuerst must du rausfinden, wo die Fehlermeldung ausgelöst wird.
    Denn standardmäßig schließen sich DataSet-Komponenten ohne Fehlermeldung!
    Nimm mal ein Debugger, und verfolge die Abläufe beim Schließen, insbesondere den Zugriff auf die Datenbank. Denk dran, der Fehler wird durch explizites Zugreifen auf die Datenbank hervorgerufen. Es muß in deinem Code zu finden sein.

    bis bald
    akari



  • so, habe mal nach dem käfer gesucht.
    fehler trat auf bei

    adotb_ftp->Active = false;
    

    welches ich beim schließen der form vor dem schließen der connection.

    habe es ausgeklammert und nun klappt es.

    dachte es wäre sauberer gewesen, das wieder zu deaktivieren ??



  • Hallo

    im Grunde schon. Allerdings wird das durch einen Aufruf des Destruktors auch gemacht.
    Und wenn du an adotb_ftp noch weitere Controls hängen hast, die trotz Deaktivieren noch auf die Abfrage zugreifen wollen, ist es eben besser, das automatisch machen zu lassen.

    bis bald
    akari



  • ja, immo hatte ich da noch gar nichts dran außer nen datasource, der wird aber auch noch nicht benutzt. hoffe mal das es nicht noch mehr fehler geben wird. aber das glaube ich eher weniger. es geht halt nicht ohne.

    Kannst ja mal im Forum "Projekte nachschauen" da ist die exe drinne, jedoch ist da noch nicht die DB angebunden, da es mir immo nur um den player ging, da mein freund da eine Fehlermeldung bekommt. kannst es dir ja mal anschauen 😉

    Vielen Dank für die Antwort und gedult 😉



  • so, ich habe wieder einen fehler in der Insert Into Anweisung. Nur diesmal weis ich nicht weiter. wollte da einfach die Variablen rein machen:

    adoqu_save->SQL->Add("INSERT INTO tb_ftp (bezeichnung,host,port,user) VALUES('"+txt_bezeichnung->Text+"','"+txt_host->Text+"','"+a_port+"','"+txt_username->Text+"')");
    

    jedoch kommt wieder fehlermeldung, das die Anweisung einen fehler hat. muss ich da doch die Anführungszeichen anders setzten`?



  • Vielleicht müssen da noch ein paar Leerzeichen rein. Beim Einfügen von Strings in eine SQL-Query macht sich auch "QuotedStr()" ganz gut.



  • irgendwie raff ich das immo nicht



  • hab das mal anders ausprobiert. kommt aber die gleiche meldung

    adoqu_save->SQL->Add("INSERT INTO tb_ftp (bezeichnung,host,port,user)");
                   adoqu_save->SQL->Add("VALUES(:bezeichnung,:host,:port,:user)");
    
                   adoqu_save->Parameters->ParamByName("bezeichnung")->Value = txt_bezeichnung->Text;
                   adoqu_save->Parameters->ParamByName("host")->Value = txt_host->Text;
                   adoqu_save->Parameters->ParamByName("port")->Value =  a_port;
                   adoqu_save->Parameters->ParamByName("user")->Value = txt_username->Text;
    
                   adoqu_save->ExecSQL();
    

    EDIT:

    in einem früheren Programm klappte dieses wunderbar, jedoch verwendete ich dort das TQuery und nicht wie jetzt das TADO_Query.

    QuerySave->SQL->Clear();
       QuerySave->SQL->Add("INSERT INTO archiv(interpret,titel,album,richtung,bewertung)");
       QuerySave->SQL->Add("VALUES(:interpret,:titel,:album,:richtung,:bewertung)");
    
       QuerySave->ParamByName("interpret")->Value = txt_interpret->Text;
       QuerySave->ParamByName("titel")->Value = txt_titel->Text;
       QuerySave->ParamByName("album")->Value = txt_album->Text;
    
       QuerySave->ParamByName("richtung")->Value = txt_richtung->Text;
       QuerySave->ParamByName("bewertung")->Value = txt_bewertung->Text;
    
       QuerySave->ExecSQL();
    

    bei TADO musste ich auch vor PramByName das Parameters setzten, damit ich da dran kam. Nur bekomme ich immer wieder "Syntaxfehler", obwohl alles soweit so gesehen 1:1 ist??!?!!?%"§%



  • Hallo

    vielleicht ist ja das

    QuerySave->SQL->Clear();

    der Unterschied?

    Du kannst doch mal das fertige SQL-Kommando direkt vor adoqu_save->ExecSQL() ausgeben lassen (Debugger), und in einem passendem Datenbank-Frontend (Access?) direkt ausprobieren.
    Dann wirst du ja sehen, welcher Teil falsch ist.

    bis bald
    akari



  • wie kann ich mir das ausgeben lassen, habe noch nicht so viel mit dem debugger gearbeitet?

    Edit: das Clear ist da schon vor, habe es vergessen mit einzufügen.

    in der Hilfe steht auch folgendes

    ADOQuery1->ParamByName("Verb").Value = "propitiate";
    

    jedoch wenn ich die variablen etc. entsprechen um ändere kommt Meldung das "ParamByName kein Element von adqu_query ist" auch irgendwie komisch. ist ja ne falsche Hilfe 😉



  • Ich speichere die SQL-Qurey fürs debuggen normalerweise mit QuerySave->SQL->SaveToFile("sql_test.sql"); Ich finde diese Art etwas übersichtlicher als den Debugger (insbesondere bei mehreren Zeilen).


Anmelden zum Antworten