![]() |
Datenbank: sqllite • Version: ? • Zugriff über: direkt
Variablen übergeben bei insert
Ich arbeite an diesem Tutorial:
![]() Nun möchte ich bei diesem Teil: Testdaten hinzufügen
Delphi-Quellcode:
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.
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; Quasi:
Delphi-Quellcode:
Var Aid = 7;
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid, ISBN) VALUES (NULL,"B1",1,"123");'; |
AW: Variablen übergeben bei insert
Hallo,
Delphi-Quellcode:
oder bei Dir
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid,ISBN) VALUES (NULL,"B1",'+IntToStr(MeineId)+',"123");';
Delphi-Quellcode:
FSQLCommandText := 'INSERT INTO Buecher(BuchID,Titel, Aid,ISBN) VALUES (NULL,"B1",'+IntToStr(AId)+',"123");';
|
AW: Variablen übergeben bei insert
Warum keine (SQL-)Parameter?
|
AW: Variablen übergeben bei insert
Und für Texte ala
Delphi-Quellcode:
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.
"B1"
Am Besten ist es natürlich immer, wenn die DB-Schnittstelle parametrisierte Abfragen ermöglicht. Oftmals in etwa so
Delphi-Quellcode:
Is natürlich unschön, dass es hier so nicht geht.
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; |
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:
bei der direkten Verwendung von IDs ist zu oft etwas schief gegangen.
'INSERT INTO Buecher(BuchID, Titel, Aid, ISBN) VALUES (NULL, :Titel, (select AId from nutzertable where Name=:nutzername), :ISBN);';
(zumindestens bei mir) Gruß K-H |
AW: Variablen übergeben bei insert
wenn man zu kompliziert denkt, kommt man auf so einfache Lösungen nicht :oops:
Danke :thumb: Zitat:
|
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. |
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.
|
AW: Variablen übergeben bei insert
Hallöle...8-)
Zitat:
|
AW: Variablen übergeben bei insert
Stimmt auch wieder
Aber in diesem Fall nutze nur ich das Programm als kleines Hilfsmittel zur Erfassung. |
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. |
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:
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.
const
csSQL = 'INSERT INTO Buecher(BuchID,Titel, Aid, ISBN) VALUES (NULL, %s, %d, %s)'; ... begin ... FSQLCommandText := Format(csSQL,[QuotedStr('B1'), AId, QuotedStr('123')]); ... |
AW: Variablen übergeben bei insert
Zitat:
![]() Zitat:
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. |
AW: Variablen übergeben bei insert
Zitat:
' 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. |
AW: Variablen übergeben bei insert
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 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