Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mysql Insert Fehler (https://www.delphipraxis.net/40342-mysql-insert-fehler.html)

Masterof 14. Feb 2005 17:06

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:
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;
Achso, bevor ich es vergesse, wenn ich das ganze mit einem Datensatz mache funktioniert es.

MfG Master

lume96 14. Feb 2005 17:40

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:
  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;
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).

(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

Masterof 14. Feb 2005 18:12

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

lume96 14. Feb 2005 18:30

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

Masterof 14. Feb 2005 18:39

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

BorlanDelphiUser 22. Feb 2005 14:11

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?

Masterof 22. Feb 2005 14:34

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

lume96 22. Feb 2005 14:46

Re: Mysql Insert Fehler
 
Moin,

Zitat:

Zitat von BorlanDelphiUser
@lume96 igendwie blicke ich da bei deinem code nicht durch ... was bewirkt dieser?

Wenn Du mit Parametern arbeitest, dann gibst Du in der eigentlichen SQL-Instruktion keine Werte mehr an, sondern "Variablen" (erkennt man durch den Doppelpunkt).

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

alcaeus 22. Feb 2005 14:49

Re: Mysql Insert Fehler
 
Zitat:

Zitat von lume96
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.

Das beginnt schon früher. Auch in einem Editfeld werden intern alle ' durch '' ersetzt. Der Lesevorteil ist nur ein kleiner Bonus, aber die Sache mit den Variablen und formatierungen fällt schon sehr ins Gewicht.

Greetz
alcaeus

BorlanDelphiUser 22. Feb 2005 15:00

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:
<?
  echo 'Irgendwas';
?>
Und wenn ich dann folgendes mache ...
Delphi-Quellcode:
Form1.q_for_tipp.Sql.Text := 'INSERT INTO `code_schnipsel` SET code='''+ Form1.SynEdit1.Text +''' ';
Form1.q_for_tipp.ExecSql;
... dann kommt der tolle Fehler .. You have an Error in your SQL Syntax .. bla bla bla

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?

Masterof 22. Feb 2005 15:06

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

alcaeus 22. Feb 2005 15:14

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: Delphi-Referenz durchsuchenQuotedStr

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

lume96 22. Feb 2005 15:18

Re: Mysql Insert Fehler
 
Moin,
Zitat:

Zitat von BorlanDelphiUser
... dann kommt der tolle Fehler .. You have an Error in your SQL Syntax .. bla bla bla

Den hast Du auf jeden Fall, denn die korrekte Syntax für'n INSERT Statement lautet
SQL-Code:
INSERT INTO table VALUES();
oder eventuell
SQL-Code:
INSERT INTO table(field1,field2) VALUES();
Ein SET hat hier nichts zu suchen (das kommt im UPDATE vor).
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

BorlanDelphiUser 22. Feb 2005 15:28

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.

BorlanDelphiUser 22. Feb 2005 15:38

Re: Mysql Insert Fehler
 
so ich hab das ganze auf den Syntax ...
SQL-Code:
INSERT INTO table(field1,field2) VALUES();
... geändert. hat nicht gebracht es liegt eindeutig an den vorkommenden ' Zeichen.
Es muss doch dafür eine Lösung geben ...

alcaeus 22. Feb 2005 15:51

Re: Mysql Insert Fehler
 
Moin BorlanDelphiUser,

versuchs mal mit diesem Code:
Delphi-Quellcode:
StringReplace(Form1.SynEdit1.Text, '''', '\''', [rfReplaceAll]);
oder vielleicht etwas "lesefreundlicher":
Delphi-Quellcode:
StringReplace(Form1.SynEdit1.Text, #39, '\'+#39, [rfReplaceAll]);
Dritte Möglichkeit:
Delphi-Quellcode:
Query1.SQL.Text := 'INSERT INTO tabelle values ("'+Form1.SynEdit1.Text+'")';
Greetz
alcaeus

[edit]"hk" durch "#39" ersetzt...das hat man davon wenn die konstanten immer definiert sind :wall:[/edit]

BorlanDelphiUser 22. Feb 2005 16:07

Re: Mysql Insert Fehler
 
@alcaeus

danke werd gleich mal durchprobieren ...

BorlanDelphiUser 22. Feb 2005 16:14

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]);

lume96 22. Feb 2005 16:16

Re: Mysql Insert Fehler
 
Zitat:

Zitat von BorlanDelphiUser
so ich hab das ganze auf den Syntax ...
SQL-Code:
INSERT INTO table(field1,field2) VALUES();
... geändert. hat nicht gebracht es liegt eindeutig an den vorkommenden ' Zeichen.
Es muss doch dafür eine Lösung geben ...

Wie jetzt, hast Du es mal so probiert :
SQL-Code:
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;
Ich hab das mal eben schnell getestet und habe kein Problem mit :
Code:
<?
  echo 'Irgendwas';
?>
im Memo.

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

alcaeus 22. Feb 2005 16:25

Re: Mysql Insert Fehler
 
Zitat:

Zitat von BorlanDelphiUser
BTW ... gleich die erste Variante hat funktioniert.

Die macht eigentlich dasselbe wie die zweite, allerdings ist die zweite lesbarer... (wenn man das Posting editiert und "#39" anstatt "hk" schreibt :wall:)

Greetz
alcaeus

BorlanDelphiUser 22. Feb 2005 16:27

Re: Mysql Insert Fehler
 
Zitat:

Zitat von lume96
Zitat:

Zitat von BorlanDelphiUser
so ich hab das ganze auf den Syntax ...
SQL-Code:
INSERT INTO table(field1,field2) VALUES();
... geändert. hat nicht gebracht es liegt eindeutig an den vorkommenden ' Zeichen.
Es muss doch dafür eine Lösung geben ...

Wie jetzt, hast Du es mal so probiert :
SQL-Code:
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;
Ich hab das mal eben schnell getestet und habe kein Problem mit :
Code:
<?
  echo 'Irgendwas';
?>
im Memo.

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

Nein hab ich nicht getestet .. werd ich aber gleich mal tun denn ... das von alcaeus hat zwar funktioniert .. aber auch nur bei Einträgen wo nicht mehr als 2 ' Zeichen aufeinander folgen. Ansonsten kommt es wieder zum selben Fehler.
Schade zu früh gefreut. Ich teste jetzt mal deine Variante.

Masterof 22. Feb 2005 16:32

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

Schuster 22. Feb 2005 16:44

Re: Mysql Insert Fehler
 
Wie schon vorher erwähnt worden ist solltest du mal QuotedStr :thumb: verwenden.

Delphi-Quellcode:
with ZQuery1 do
begin
     sql.Clear;
     sql.Add('Insert into Table (Feld1,Feld2,) Values ('+
              QuotedStr(Wert1)+','+
              QuotedStr(Wert2)+ ')');
     ExecSQL;
end;
Dadurch kannst du Sonderzeichen wie ' " usw verwenden. :-D

BorlanDelphiUser 22. Feb 2005 16:54

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.

BorlanDelphiUser 22. Feb 2005 17:08

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' ';

Masterof 22. Feb 2005 17:14

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:
Form1.q_for_tipp.SQL.Text := 'UPDATE code_schnipsel SET titel=':titel' WHERE id='12' ';
MfG Master

Schuster 22. Feb 2005 17:19

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;

BorlanDelphiUser 22. Feb 2005 17:21

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!

BorlanDelphiUser 22. Feb 2005 17:28

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

lume96 22. Feb 2005 17:36

Re: Mysql Insert Fehler
 
SQL-Code:
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;
Auch hier wieder mit Params falls Du Steuerzeichen im Titel hast.

(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

Masterof 22. Feb 2005 19:10

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:
Form1.q_for_tipp.SQL.Text := 'UPDATE code_schnipsel SET titel=':titel' WHERE id= "12"';
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.

MfG Master

BorlanDelphiUser 22. Feb 2005 20:27

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