Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Variablen übergeben bei insert (https://www.delphipraxis.net/190007-variablen-uebergeben-bei-insert.html)

BBoy 19. Aug 2016 15:13

Datenbank: sqllite • Version: ? • Zugriff über: direkt

Variablen übergeben bei insert
 
Ich arbeite an diesem Tutorial: https://www.delphi-treff.de/tutorial...d-dbexpress/2/

Nun möchte ich bei diesem Teil:
Testdaten hinzufügen
Delphi-Quellcode:
var FSQLCommandText: String; FSQLDataSet: TDataSet; sStr: String; i: Integer;

Try
  FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel,AutorID,ISBN) VALUES (NULL,"B1",1,"123");';
  SQLConnection.ExecuteDirect(FSQLCommandText);
  FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel,AutorID,ISBN) VALUES (NULL,"B2",1,"456");';
  SQLConnection.ExecuteDirect(FSQLCommandText);
Except On E: EDatabaseError Do ShowMessage(E.Message);
End;
Variablen übergeben. Also anstatt AutorID eine Variable in der die AutorID steht. Wie kann ich das verwirklichen? Denn bisher habe ich nur eine SQLConnection auf dem Formular.
Quasi:
Delphi-Quellcode:
Var Aid = 7;
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid, ISBN) VALUES (NULL,"B1",1,"123");';

hoika 19. Aug 2016 15:21

AW: Variablen übergeben bei insert
 
Hallo,

Delphi-Quellcode:
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid,ISBN) VALUES (NULL,"B1",'+IntToStr(MeineId)+',"123");';
oder bei Dir
Delphi-Quellcode:
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid,ISBN) VALUES (NULL,"B1",'+IntToStr(AId)+',"123");';

mkinzler 19. Aug 2016 15:31

AW: Variablen übergeben bei insert
 
Warum keine (SQL-)Parameter?

himitsu 19. Aug 2016 15:31

AW: Variablen übergeben bei insert
 
Und für Texte ala
Delphi-Quellcode:
"B1"
muß man mal nachsehen wo sich die Quote-Funktion der DB-Schnittstelle versteckt und muß den String darüber vorher Quoten, bevor man ihn in den SQL-Text einfügt.

Am Besten ist es natürlich immer, wenn die DB-Schnittstelle parametrisierte Abfragen ermöglicht.
Oftmals in etwa so
Delphi-Quellcode:
Query.SQL.Text := 'INSERT INTO Buecher(BuchID, Titel, Aid, ISBN) VALUES (NULL, :Titel, :AId, :ISBN);';
Query.ParamByName('Titel').AsString := 'B1';
Query.ParamByName('Aid').AsInteger := 1;
Query.ParamByName('ISBN').AsString := '123';
Query.Execute;
Is natürlich unschön, dass es hier so nicht geht.

p80286 19. Aug 2016 15:36

AW: Variablen übergeben bei insert
 
Also wenn is sich z.B. um die ID eines Benutzers handelt
würde ich es so machen:
SQL-Code:
'INSERT INTO Buecher(BuchID, Titel, Aid, ISBN) VALUES (NULL, :Titel, (select AId from nutzertable where Name=:nutzername), :ISBN);';
bei der direkten Verwendung von IDs ist zu oft etwas schief gegangen.
(zumindestens bei mir)

Gruß
K-H

BBoy 19. Aug 2016 15:39

AW: Variablen übergeben bei insert
 
wenn man zu kompliziert denkt, kommt man auf so einfache Lösungen nicht :oops:

Danke :thumb:


Zitat:

Zitat von mkinzler (Beitrag 1345309)
Warum keine (SQL-)Parameter?

Ist halt so in diesem Tutorial...

hoika 19. Aug 2016 15:46

AW: Variablen übergeben bei insert
 
Hallo,

SQLConnection.ExecuteDirect(FSQLCommandText);
hat doch keine Parameter-Option oder doch?

aus der Hilfe.

Mit ExecuteDirect können Sie eine SQL-Anweisung ohne Parameter ausführen. Sie umgehen auf diese Weise sowohl die Verwendung einer SQL-Datenmenge als auch die Vorbereitung der Anweisung. Wenn die Anweisung einen Cursor zurückgibt, führt ExecuteDirect sie aus, ohne einen Cursor zurückzugeben.

SQL ist die auszuführende Anweisung.

ExecuteDirect gibt 0 zurück, wenn die Anweisung erfolgreich ausgeführt wurde. Andernfalls wird ein dbExpress-Fehlercode zurückgeliefert.
Anmerkung: Verwenden Sie für SQL-Anweisungen, die Parameter enthalten oder einen Cursor zurückgeben, die Methode Execute.

BBoy 19. Aug 2016 19:15

AW: Variablen übergeben bei insert
 
Stimmt. Eigentlich wäre SQLConnection.Execute die bessere Wahl. Aber ich denke für meinen einfachen Zweck ist es auch so ok. Sind ja nicht wirklich Parameter bei mir.

haentschman 20. Aug 2016 09:15

AW: Variablen übergeben bei insert
 
Hallöle...8-)
Zitat:

Aber ich denke für meinen einfachen Zweck ist es auch so ok...
:warn: Ein "vergessener" Parameter reicht schon für SQL Injection aus... Lieber gleich richtig... :P

BBoy 20. Aug 2016 12:34

AW: Variablen übergeben bei insert
 
Stimmt auch wieder
Aber in diesem Fall nutze nur ich das Programm als kleines Hilfsmittel zur Erfassung.

Dennis07 21. Aug 2016 09:06

AW: Variablen übergeben bei insert
 
Sorry Leute, aber bin ich irgendwie Blöd? Muss man in SQL nicht die Pascal-Strings verwenden?
Also mit ' und nicht mit "...? Das nur am Rande, ich kenne mich mit Delphi SQL-API Zeugs nicht so gut aus.

Außerdem empfehle ich persönlich die AUTO_INCREMENT-Option bei IDs. Das macht es deutlich leichter, da man auch im nachhinein noch Einträge einfügen kann, ohne die höcchste ID zu kennen. Geht allerdings nur bei UNIQUE bzw. PRIMARY-Spalten. Auch würde ich persöhnlich zur Fehlervermeidung empfehlen, alle Strings in SQL in Anführungszeichen zu packen. Denn wenn der Spalten-/Zeilenbezeichner oder der Kästchenwert Leerzeichen oder andere reservierte Zeichen/Ausdrücke enthält (wieso auch immer) dann kriegst du einen Fehler oder noch schlimmer, es wird eine falsche Anfrage ausgeführt.

nahpets 21. Aug 2016 09:54

AW: Variablen übergeben bei insert
 
@Dennis:

Also wenn ich sowas mache und keine Parameter verwende, dann nutze ich QuotedStr. Damit hab' ich dann immer das Richtige, ohne weiter drüber nachdenken zu müssen.

Delphi-Quellcode:
const
  csSQL = 'INSERT INTO Buecher(BuchID,Titel, Aid, ISBN) VALUES (NULL, %s, %d, %s)';
...
begin
...
  FSQLCommandText := Format(csSQL,[QuotedStr('B1'), AId, QuotedStr('123')]);
...
So kann man auch recht einfach SQL-Scripte erstellen, die man dann später mit anderen Mitteln, über irgendeine Datenbankoberfläche ... in die Datenbank "jagen" kann.

Dennis07 21. Aug 2016 19:40

AW: Variablen übergeben bei insert
 
Zitat:

Zitat von nahpets (Beitrag 1345363)
Also wenn ich sowas mache und keine Parameter verwende, dann nutze ich QuotedStr. Damit hab' ich dann immer das Richtige, ohne weiter drüber nachdenken zu müssen.

Naja, wie du hier ja lesen kannst, macht QuotedStr ja nichts außer den String in ' zu packen. Nur warem im ersten Beitrag ja normale Anfhrungszeichen (") zu sehen:
Zitat:

Zitat von BBoy (Beitrag 1345306)
Delphi-Quellcode:
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid, ISBN) VALUES (NULL,"B1",1,"123");';

Und das ist meines Wissens nach in alle SQL-Dialekten falsch. Es gibt meines Wissens nach kein gängiges SQL, das nicht die Pascal-Strings verwendet, also Apostrophe ('). SQL müsste als bei " einen Fehler ausgeben.

Außerdem bleibt hier immer noch das Problem, dass falls der String selbst Zeichen wie ' enthält, diese so noch nicht "escaped" werden. Das muss man noch über eine Kodierungs-/Dekodierungs-Routine machen. Ansonsten kriegst du nämlich wurstsalat wenn dein String zum Beispiel ' Zeichen enthält.

Außerdem musst du darauf achten, dass du AnsiQuotedStr bei Multibyte-Strings benutzt.

himitsu 21. Aug 2016 19:59

AW: Variablen übergeben bei insert
 
Zitat:

Zitat von Dennis07 (Beitrag 1345367)
('). SQL müsste als bei " einen Fehler ausgeben

Fast alle SQL-Dialekte kennen beide/mehrere Quote-Zeichen.
' und " und manchmal auch ´

Sie unterscheiden aber anhand des Quotings, um was für eine "Art" von String es sich handelt
> Text (Strings)
> Bezeichner (z.B. Namespace-, Typen-, Tabellen- oder Spaltenbezeichner)

SQL kenn mehr Steuerzeichen, darum ist QuoteString auch falsch, denn wie in den üblichen C-Dialekten, ist der Backslash "\" ein Steuerzeichen
und den behandelt die RTL-Funktion QuoteStr garnicht.

Wie gesagt, jede "orgendliche" Datenbank-Schnittstelle besitzt mindetens eine SQL-Quote-Funktion und jene muß man verwenden.

Dennis07 21. Aug 2016 22:28

AW: Variablen übergeben bei insert
 
Zitat:

Zitat von himitsu (Beitrag 1345368)
Fast alle SQL-Dialekte kennen beide/mehrere Quote-Zeichen.
' und " und manchmal auch ´

Danke, war mir so nicht bewusst. Were mich mal schlau machen diesbezüglich.

Zitat:

Zitat von himitsu (Beitrag 1345368)
SQL kenn mehr Steuerzeichen, darum ist QuoteString auch falsch, denn wie in den üblichen C-Dialekten, ist der Backslash "\" ein Steuerzeichen
und den behandelt die RTL-Funktion QuoteStr garnicht.

Wie ich sagte, man muss die entsprechenden reservierten Zeichen "escapen" (gibt's dafür einen deutschen Fachterminus?). Hatte ich ja bereits zwei mal geschrieben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 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