![]() |
Datenbank: mysql • Version: 4.0 • Zugriff über: mysql
Mysql Insert Fehler
Hallo!!
Ich habe eine Anwendung geschrieben die Wörter aus einer Textdatei ausließt ordnet und in eine Mysql Datenbank schreibt. Die Wörter stehen in einem Stringgrid, wenn ich sie Zeile für Zeile in die Datenbank schreiben möchte bricht das Programm ab und bringt folgenden Fehler. You have an error in your Sql Syntax. Ich verwende die ZeosAccess Komponenten für den Zugriff auf die Datenbank. Hier ist der Quellcode bei dem der Fehler entsteht.
Delphi-Quellcode:
Achso, bevor ich es vergesse, wenn ich das ganze mit einem Datensatz mache funktioniert es.
procedure Tfrmwordconvert.InMySql1Click(Sender: TObject);
var i : integer; begin for i:= 1 to sgwords.rowcount -1 do begin connection.DMmysql.ZQuery1.SQL.Text:= 'Insert Into english ' + '(`ordnr`, `words`)'+ ' VALUES '+ '('''+sgwords.Cells[0,i]+''', '''+sgwords.Cells[2,i]+''');'; //showmessage(connection.DMmysql.ZQuery1.SQL.Text); connection.DMmysql.ZQuery1.ExecSQL; end; end; MfG Master |
Re: Mysql Insert Fehler
Moin,
könnte es sein, dass Deine Wörter aus der Text-Datei vielleicht irgendwelche Zeichen beinhalten, die Dein SQL-Statment "zerstören" (z.B. , oder ', etc...). Sicherheitshalber würde ich es mal mit Parametern versuchen. Das sollte in etwa so aussehen :
Delphi-Quellcode:
Ich hab den Code jetzt nicht getestet, kann also sein, dass er so nicht ganz korrekt ist (sollte Dich lediglich in die richtige Richtung bringen).
ZQuery1.Sql.Text := 'INSERT INTO ENGLISH (ordnr,words) VALUES (:onr,:wds)';
ZQuery1.Params.Clear; ZQuery1.Params.CreateParam(ftInteger,'onr', ptInput); ZQuery1.Params.CreateParam(ftString,'wds', ptInput); ZQuery1.ParamByName('onr').AsInteger := sgwords.Cells[0,i]; ZQuery1.ParamByName('wds').AsString := sgwords.Cells[2,i]; ZQuery1.ExecSQL; (Typen unter Umständen anpassen, ich bin von einem Integer für die "ornr" und einem String für die "words" ausgegangen). Tschüss, Lutz |
Re: Mysql Insert Fehler
Hallo!!
Ja du hattest recht, es sind Steuerzeichen die aus der Textdatei im SQL String Fehler verursachen. Du hast ftString verwendet, woher bekommst du diese Werte, es verursacht bei mir einen Fehler. MfG Master |
Re: Mysql Insert Fehler
Moin,
Du gibst leider nicht an, welche Version der ZEOS Lib Du benutzt. Hab jetzt mal kurz Delphi gestartet und eine ZQuery auf einen Form geschoben. Bei meiner Version von ZEOS (6.15 stable) werden folgende units im uses hinzugefügt : DB ZAbstractRODataset ZAbstractDataset ZDataset ftString sollte in einem dieser units definiert sein, denn bei mir gibt's beim kompilieren keinen Fehler. Tschüss, Lutz |
Re: Mysql Insert Fehler
Hallo!!
Ich habe eben mal schnell nachgeschaut, ich verwende die 6.1.5. Ok habe den Fehler gefunden, ich habe die Verbindung in einer DLL und musste in die Unit noch die 4 Sachen im uses Teil hinzufügen. Danke MfG Master |
Re: Mysql Insert Fehler
Hallo ich hab gerade auch das problem beim INSERT und UPDATE ... weil ich PHP Code in der DB speichern will stören dort auch die Steuerzeichen ' ...
@lume96 igendwie blicke ich da bei deinem code nicht durch ... was bewirkt dieser? Wandelt der die ' Zeichen um oder wie? |
Re: Mysql Insert Fehler
Hallo!!
Also der Code den Lume geposted hat ist bewirkt, dass du keine Steuerzeichen brauchst. Du schreibst den Text vorher in eine Stringvariable und übergibst den Inhalt an die Datenbank. Du kannst mir ja die PHP Datei mal zukommen lassen. Wenn du möchtest dann schaue ich mal was ich machen kann. MfG Master |
Re: Mysql Insert Fehler
Moin,
Zitat:
Mit dem ParamByName('abc').AsString := ... weist Du der Variable dann einen Wert zu. Spontan fallen mir mindestens drei Vorteile ein : 1) Die eigentliche SQL-Instruktion ist leichter zu lesen. 2) Man ärgert sich nicht mehr mit der Unzahl von ' rum (soch nach dem Motto ...+'('''+... :shock: ) 3) Strings (aber auch z.B. Dates) werden richtig formatiert. Ich bin nie in die Interna eingestiegen, kann also leider nicht erklären, wie das intern gehandhabt wird. Warscheinlich werden die Strings, falls nötig, entsprechend ge-quoted. Tschüss, Lutz |
Re: Mysql Insert Fehler
Zitat:
Greetz alcaeus |
Re: Mysql Insert Fehler
Also ich erkläre euch mal mein Problem etwas genauer ...
Ich habe ein Memo wo ich bekiebigen PHP Code eingebe wie z.b.
Code:
Und wenn ich dann folgendes mache ...
<?
echo 'Irgendwas'; ?>
Delphi-Quellcode:
... dann kommt der tolle Fehler .. You have an Error in your SQL Syntax .. bla bla bla
Form1.q_for_tipp.Sql.Text := 'INSERT INTO `code_schnipsel` SET code='''+ Form1.SynEdit1.Text +''' ';
Form1.q_for_tipp.ExecSql; Ist ja auch ganz klar weil diese schicken ' Zeichen eingefügt werden, was dann meinen SQL Syntax zerstöt . Wie kann ich dieses Problem lösen? |
Re: Mysql Insert Fehler
Hallo!!
Du müsstest das mit den Parametern genauso machen können, denn du kannst ja auch in in einem Memo die Zeilen zählen. So liest du es Zeile für Zeile aus und baust das mit dem Paramtern zusammen. MfG Master |
Re: Mysql Insert Fehler
@BorlanDelphiUser: Dein Statement ist schon mal syntaktisch komplett falsch (jedenfalls wüsse ich nicht von einem "insert into set" statement.
Für alle anderen mal eine Funktion und ein Zitat: ![]() Die Delphi-OH zum Thema QuotedStr: Use QuotedStr to convert the string S to a quoted string. A single quote character (') is inserted at the beginning and end of S, and each single quote character in the string is repeated. Das dürfte das Problem aus der Welt schaffen. Greetz alcaeus |
Re: Mysql Insert Fehler
Moin,
Zitat:
SQL-Code:
oder eventuell
INSERT INTO table VALUES();
SQL-Code:
Ein SET hat hier nichts zu suchen (das kommt im UPDATE vor).
INSERT INTO table(field1,field2) VALUES();
SQL-Code:
Query.Sql.Text := 'INSERT INTO Code_schnipsel VALUES (:phpcode)';
Query.Params.Clear; Query.Params.CreateParam(ftString,'phpcode', ptInput); Query.ParamByName('phpcode').AsString := Form1.SynEdit1.Text; Query.ExecSQL; Tschüss Lutz |
Re: Mysql Insert Fehler
Hmm also wenn ich PHP programmiere ist das so ziemlich egal ich find das so nähmlich besser ... bei langen Abfragen muss man nicht immer schauen an welche Stelle welcher Inhalt hinmuss ... deswegen ziehe ich das mit SET eigetlich vor.
Aber ich probiere es gleich mal mit dem anderen Syntax ... denn QuotedStr hat auch nicht funktioniert. |
Re: Mysql Insert Fehler
so ich hab das ganze auf den Syntax ...
SQL-Code:
... geändert. hat nicht gebracht es liegt eindeutig an den vorkommenden ' Zeichen.
INSERT INTO table(field1,field2) VALUES();
Es muss doch dafür eine Lösung geben ... |
Re: Mysql Insert Fehler
Moin BorlanDelphiUser,
versuchs mal mit diesem Code:
Delphi-Quellcode:
oder vielleicht etwas "lesefreundlicher":
StringReplace(Form1.SynEdit1.Text, '''', '\''', [rfReplaceAll]);
Delphi-Quellcode:
Dritte Möglichkeit:
StringReplace(Form1.SynEdit1.Text, #39, '\'+#39, [rfReplaceAll]);
Delphi-Quellcode:
Greetz
Query1.SQL.Text := 'INSERT INTO tabelle values ("'+Form1.SynEdit1.Text+'")';
alcaeus [edit]"hk" durch "#39" ersetzt...das hat man davon wenn die konstanten immer definiert sind :wall:[/edit] |
Re: Mysql Insert Fehler
@alcaeus
danke werd gleich mal durchprobieren ... |
Re: Mysql Insert Fehler
@alcaeus ... SUPER!!! Endlich funktioniert es ... DANKE DANKE !!!
BTW ... gleich die erste Variante hat funktioniert.
Delphi-Quellcode:
StringReplace(Form1.SynEdit1.Text, '''', '\''', [rfReplaceAll]);
|
Re: Mysql Insert Fehler
Zitat:
SQL-Code:
Ich hab das mal eben schnell getestet und habe kein Problem mit :
ZQuery1.Params.Clear;
ZQuery1.SQL.Text := 'INSERT INTO Code_Schnipsel(Code) VALUES(:phpc)'; ZQuery1.Params.CreateParam(ftString,'phpc',ptInput); ZQuery1.ParamByName('phpc').AsString := Memo1.Text; ZQuery1.ExecSQL;
Code:
im Memo.
<?
echo 'Irgendwas'; ?> Zugegeben, ich hab's mit einer Firebird DB getestet; habe hier keine MySQL zum Test. Eigentlich sollte das aber nichts zur Sache tun. Tschüss, Lutz |
Re: Mysql Insert Fehler
Zitat:
Greetz alcaeus |
Re: Mysql Insert Fehler
Zitat:
Schade zu früh gefreut. Ich teste jetzt mal deine Variante. |
Re: Mysql Insert Fehler
Hallo!!
Dann lösche doch alle unwichtigen Zeichen, und lass nur noch die für die Datenbanken relevanten Zeichen stehen. Ich denke das sollte funktionieren. Du kannst ja mal den Quelltext der Prozedur posten, dann sieht man dein Problem besser MfG Master |
Re: Mysql Insert Fehler
Wie schon vorher erwähnt worden ist solltest du mal QuotedStr :thumb: verwenden.
Delphi-Quellcode:
Dadurch kannst du Sonderzeichen wie ' " usw verwenden. :-D
with ZQuery1 do
begin sql.Clear; sql.Add('Insert into Table (Feld1,Feld2,) Values ('+ QuotedStr(Wert1)+','+ QuotedStr(Wert2)+ ')'); ExecSQL; end; |
Re: Mysql Insert Fehler
@alcaeus ... ich hatte nur die erste Variante getestet .. das die Zeiter das selbe macht hast du doch geschrieben ;)
@lume96 ... super das hat jetzt wirklich funktioniert kann eingaben was ich will er Trägt alles ohne zu meckern in die Datenbank ein. DANKE @Schuster ... wie ich schon vorher erwähnt habe, habe ich das auch schon Probiert ... das hat mir nur noch mehr ' Zeichen eingebaut (logisch) ... konnte das also fürs SQL Query nicht gebrauchen ... aber ich kann das sicher mal wann anders gebrauchen. |
Re: Mysql Insert Fehler
So jetzt hab ich noch eine Frage ... wie muss das ganze beim UPDATE aussehen? der hat mir das ganze nicht richtig eingefügt also es steht jetzt :titel drin
Delphi-Quellcode:
Form1.q_for_tipp.SQL.Text := 'UPDATE code_schnipsel SET titel='':titel'' WHERE id='12' ';
|
Re: Mysql Insert Fehler
Hallo!!
Da du schreist :Titel in HK, also gibst du also gibst du :titel in die Datenbank, da es nicht als Variable verwendet wird. Versuche es mal so.
Delphi-Quellcode:
MfG Master
Form1.q_for_tipp.SQL.Text := 'UPDATE code_schnipsel SET titel=':titel' WHERE id='12' ';
|
Re: Mysql Insert Fehler
Update:
Delphi-Quellcode:
with DataModule1.ZQuery_Sonst do
begin sql.Clear; sql.Add('Update Tabelle Set '+ 'Feld1 =' +QuotedStr(Edt_Sch_anlegen_SchNr.Text)+ ','+ 'Feld2 = '+ QuotedStr(Cmb_Sch_anlegen_Sparte.Text) + 'where SchadennrIntern = ''' + Wert +''';'); ExecSQL; end; |
Re: Mysql Insert Fehler
:wall: ... ja jetzt wo ich das sehe ist es mit auch klar ... man oh man soviele Probleme hatte ich noch nie mit HK. Na dann sollte es ja etzt funktionieren .. dnke ich mal
nochmals DANKE! |
Re: Mysql Insert Fehler
tja also wenn ich die HK weglasse dann kommt folgendes
[Fehler] Unit3.pas(85): ':=' erwartet, aber ':' gefunden .. ich werd mal was anderes probieren vielleicht funktioniert das |
Re: Mysql Insert Fehler
SQL-Code:
Auch hier wieder mit Params falls Du Steuerzeichen im Titel hast.
ZQuery1.Params.Clear;
ZQuery1.SQL.Text := 'UPDATE Code_Schnipsel SET Titel=:titel where ID=:id'; ZQuery1.Params.CreateParam(ftString,'titel',ptInput); ZQuery1.Params.CreateParam(ftInteger,'id',ptInput); ZQuery1.ParamByName('titel').AsString := TitelEdit.Text; ZQuery1.ParamByName('id').AsInteger := 12; ZQuery1.ExecSQL; (Bin davon ausgegangen, dass Deine ID ein Integer ist. Im Prinzip kannst Du alles mit Params machen. Dann musst Du Dir bezüglich des Inhalts keine Fragen stellen. Tschüss, Lutz |
Re: Mysql Insert Fehler
Hallo!!
habe es fast vergessen, schreibe die id in eine Variable. Du unterbrichst den String bei der ID wieder, da du an dieser Stelle wieder ein HK verwendest. Versuche es mal so
Delphi-Quellcode:
Ich habe es nicht getestet, aber ich denke, es müsste so funktionieren, da ich das Anführungszeichen bei einer Sql Abfrage verwendet habe, und da hat es funktioniert.
Form1.q_for_tipp.SQL.Text := 'UPDATE code_schnipsel SET titel=':titel' WHERE id= "12"';
MfG Master |
Re: Mysql Insert Fehler
@masterof ... hat sich erledigt, hab jetzt das von lume96 genommen das funktioniert wunderbar.
und bei deinem zuletzt geposteten Quellcode komt es glaube ich auch wieder zu einem Fehler (titel=':titel') bei ': meckert er dann wieder, aber das hatte ich glaube ich schon geschrieben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz