Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Query Variable in INSERT INTO VALUES Anweisung (https://www.delphipraxis.net/132011-sql-query-variable-insert-into-values-anweisung.html)

germanos 4. Apr 2009 10:24

Datenbank: Paradox • Zugriff über: ODBC

SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo,
ich möchte mit folgendem Quellcode Daten in eine Tabelle übergeben. Bei den 4 EDIT.Texten geht es ohne Problem. Die Spalten der Tabelle sind wie folgt formatiert:
E2.text=INTEGER; E1.Text=INTEGER; MEDatum.text=DATE; EdText.Text=ALPHA
Der problematische Teil ist EdPreis.Text. Hier ist die Tabellenspalte CURRENCY und ich bekomme die Daten nicht untergebracht.

Hier der Quelltext:

procedure TForm1.EdPreisKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin

if (Key=VK_Return) then begin
n:=StrToCurr(EdPreis.Text);
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO hb_beschreib.db(monat,NkontoID,Datum,Beschreibung, Preis)');
Query1.SQL.Add('VALUES('''+E2.text+''','''+E1.Text +''','''+MEDatum.text+''','''+EdText.Text+''','''+ EdPreis.Text+''')');


Query1.ExecSQL;
Schreiben; //Ist eine Procedur zum Ausfüllen des DBGrid und geht problemlos
end;
end;

Für schnelle Hilfe bin sehr dankbar

Peter

DeddyH 4. Apr 2009 10:33

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo und Willkommen in der DP :dp:,
würdest Du Quellcode bitte künftig in Delphi-Tags einschließen, dann ist er besser zu lesen, Danke. Und zu Deinem Problem: versuch es mal mit SQL-Parametern. Beispiel:
Delphi-Quellcode:
Query.SQL.Text := 'INSERT INTO Tabelle(Stringfeld,IntegerFeld) VALUES(:str,:int)';
Query.ParamByName('str').Value := 'Hallo';
Query.ParamByName('int').Value := 10;
Query.ExecSQL;

Jürgen Thomas 4. Apr 2009 10:38

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo und ebenfalls willkommen,

Detlef war schneller als ich und hat alles Wesentliche gesagt. Nur noch als Erläuterung: Du hast Text (nämlich den eigentlichen SQL-Befehl) und Daten (nämlich die Werte) vermischt und dann auch noch die (nur bei Text nötigen) Gänsefüßchen einbauen müssen. Mit Parametern ersparst du dir den ganzen Aufwand und lässt dies vom DB-Treiber (hier: Odbc) erledigen.

Jürgen

DeddyH 4. Apr 2009 10:40

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Ergänzend zu Jürgen sei noch gesagt, dass man sich bei Verwendung von Parametern so "ganz nebenbei" auch vor SQL-Injection schützt.

germanos 4. Apr 2009 11:37

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo und danke für die schnelle Anrwort.
Leider bin ich erst seid ca. 2 Wochen mit Delphi beschäftigt und bin deshalb absolutes Greenhorn.
So kenne ich Ausdrücke und Bezeichnungen noch nicht. Dennoch möchte ich nicht aufgeben.

Zum Text:

Wie könnte in meinem Beispiel die Lösung aussehen? Die Lösung, die ich benutzt habe, fand ich auch nur in einem Forum. Ich habe sie einfach übernommen.

Ich hoffe, ich bin nicht zu anstrengend, aber mit 56 geht schon alles ein wenig langsamer.

Nochmals vielen Dank

Peter

DeddyH 4. Apr 2009 11:47

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Mal aus dem Kopf, ich hoffe, das stimmt so:
Delphi-Quellcode:
procedure TForm1.EdPreisKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin

  if (Key=VK_Return) then begin
    n:=StrToCurr(EdPreis.Text);
    Query1.SQL.Clear;
    Query1.SQL.Add('INSERT INTO hb_beschreib.db(monat,NkontoID,Datum,Beschreibung,Preis)');
    Query1.SQL.Add('VALUES(:E2,:E1,:MEDatum,:EdText,:EdPreis)');

    Query1.ParamByName('E2').Value := StrToInt(E2.Text);
    Query1.ParamByName('E1').Value := StrToInt(E1.Text);
    Query1.ParamByName('MEDatum').Value := StrToDate(MEDatum.Text);
    Query1.ParamByName('EdText').Value := EdText.Text;
    Query1.ParamByName('EdPreis').Value := n;


    Query1.ExecSQL;
    Schreiben; //Ist eine Procedur zum Ausfüllen des DBGrid und geht problemlos
  end;
end;

germanos 4. Apr 2009 15:57

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo DeddyH,

ich habe jetzt den Code probiert. Leider bekomme ich bei den ersten beiden EDIT(ShortEdit) und bei dem letzten EDIT(Currency) die Fehlermeldung "Keine Übereinstimmung der Typen im Ausdruck".
Ich habe jeden einzelnen Wert alleine übergeben, um den "Bösewicht" zu entlarven. Bei meinem ersten Entwurf kam nur bei dem letzten Wert eine Fehlermeldung.

Vielleicht gibt es eine Kleinigkeit, die ich einfach übersehe.

Schon jetzt Dank für die Hilfe,

Peter

Jürgen Thomas 4. Apr 2009 16:37

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo Peter,

vielleicht solltest du nicht nur die Fehlermeldung wiederholen, sondern auch selbst nachdenken und probieren, woran der Fehler liegen könnte.

Zu E1 und E2: Bei der ersten Frage hast du gesagt, dass es sich um Integer handelt; jetzt sprichst du von ShortEdit. Was gilt denn nun? StrToInt liefert, wie der Name sagt, einen Integer als Ergebnis. Vielleicht muss der noch explizit in einen Short konvertiert werden?

Zu Currency: StrToCurr hat gewisse Forderungen, wie der String auszusehen hat; siehe Delphi-Hilfe. Vielleicht ist die eine oder andere Bedingung nicht erfüllt?

Jürgen

germanos 4. Apr 2009 17:45

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo Detlef,
es ist richtig. Nur hatte ich die Tabelle in der Datenbankoberfläche angelegt. Hier standen mir nur die Feldtypen Integer (kurz) oder Integer (lang) zur Verfügung. Ich habe mich für kurz entschieden. Das funktionierte nicht. Ich habe die ganze Tabelle noch einmal mit SQL angelegt und hier Feld INTEGER angegeben. Das klappt nun. Das Feld Preis hat jetzt den Typ NUMERIC und mit StrToFloat(EdPreis.Text) übergeben. Das klappt jetzt auch!!??

Ich habe in den letzten Tagen eine Menge Hilfen von Delphi, auch aus dem WEB gelesen. Verstehen kann ich es meistens nach einem Beispiel. Und die stehen in der Hilfe von Delphi nicht immer zur Verfügung.

Deshalb danke ich nochmals für die Geduld mit mir.

Viele Grüße

Peter

germanos 4. Apr 2009 17:47

Re: SQL Query Variable in INSERT INTO VALUES Anweisung
 
Hallo Jürgen,
es ist richtig. Nur hatte ich die Tabelle in der Datenbankoberfläche angelegt. Hier standen mir nur die Feldtypen Integer (kurz) oder Integer (lang) zur Verfügung. Ich habe mich für kurz entschieden. Das funktionierte nicht. Ich habe die ganze Tabelle noch einmal mit SQL angelegt und hier Feld INTEGER angegeben. Das klappt nun. Das Feld Preis hat jetzt den Typ NUMERIC und mit StrToFloat(EdPreis.Text) übergeben. Das klappt jetzt auch!!??

Ich habe in den letzten Tagen eine Menge Hilfen von Delphi, auch aus dem WEB gelesen. Verstehen kann ich es meistens nach einem Beispiel. Und die stehen in der Hilfe von Delphi nicht immer zur Verfügung.

Deshalb danke ich nochmals für die Geduld mit mir.

Viele Grüße

Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz