AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Statement escapen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Statement escapen

Ein Thema von Andreas L. · begonnen am 20. Apr 2009 · letzter Beitrag vom 20. Apr 2009
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

SQL-Statement escapen

  Alt 20. Apr 2009, 13:49
Datenbank: SQLite • Version: 3 • Zugriff über: SQLiteTable3.pas
Hi,

ich schreibe mit folgenden Code Daten in eine SQLite-Datenbank:

Delphi-Quellcode:
      db.ExecSQL('INSERT INTO moz_cookies (id, name, value, host, path, expiry, lastAccessed, isSecure, isHTTPOnly)' +
                 ' VALUES ("' + IntToStr(DateTimeToUnix(Cookies[iCookie].Created) * 1000000) + '", "' +
                 Cookies[iCookie].Name + '", "' +
                 Cookies[iCookie].Content + '", "' +
                 Cookies[iCookie].Domain + '", "' +
                 Cookies[iCookie].Path + '", "' +
                 IntToStr(DateTimeToUnix(Cookies[iCookie].Expires)) + '", "' +
                 IntToStr(DateTimeToUnix(Cookies[iCookie].LastAccessed) * 1000000) + '", "' +
                 BoolToStr(Cookies[iCookie].Secure) + '", "' +
                 BoolToStr(Cookies[iCookie].WholeDomain) + '")');
Jetzt kann es aber sein das in einer der Variablen ein Anführungszeichen ( " ) enthalten ist. Dadurch wird das Statement natürlich nicht mehr ausführbar. Gibt es eine Möglichkeit dieses Zeichen zu escapen?

Grüße,
Andy
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 13:51
Ich würde (SQL-)Parameter verwenden:
INSERT INTO moz_cookies (id, name, value, host, path, expiry, lastAccessed, isSecure, isHTTPOnly) VALUES ( :id, :name, ...);
Markus Kinzler
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 13:53
Hi,

Zitat von mkinzler:
Ich würde (SQL-)Parameter verwenden:
INSERT INTO moz_cookies (id, name, value, host, path, expiry, lastAccessed, isSecure, isHTTPOnly) VALUES ( :id, :name, ...);
wie setze ich denn die Werte für diese Parameter?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:02
Mit ParamByName. => F1
Gruß
Hansa
  Mit Zitat antworten Zitat
khh

Registriert seit: 18. Apr 2008
Ort: Südbaden
1.903 Beiträge
 
FreePascal / Lazarus
 
#5

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:03
Zitat von Andreas L.:

wie setze ich denn die Werte für diese Parameter?
Query1.ParamByName('id').AsInteger := 123;


grussw KH
Karl-Heinz
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:07
Zitat von khh:
Zitat von Andreas L.:

wie setze ich denn die Werte für diese Parameter?
Query1.ParamByName('id').AsInteger := 123;


grussw KH
Ich verwende aber nicht TQuery und möchte das auch nicht, weil Leute ohne DB-Komponenten die Unit verwenden können sollen.

EDIT: ich verwende diesen SQLite-Wrapper: http://www.itwriting.com/blog/a-simp...r-for-sqlite-3
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:15
Zitat von Andreas L.:
Anführungszeichen ( " ) enthalten ist. .... Gibt es eine Möglichkeit dieses Zeichen zu escapen?
Die gesuchte Funktion heisst QuoteStr() aus Unit SysUtils.
Sie packt den übergebenen String in einfache Hochkommas was im Übrigen dem SQL-Standard entspricht.
Andreas
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:17
Zitat von SQLite3.pas:
//
Delphi-Quellcode:
// In the SQL strings input to sqlite3_prepare() and sqlite3_prepare16(),
// one or more literals can be replace by a wildcard "?" or ":N:" where
// N is an integer. These value of these wildcard literals can be set
// using the routines listed below.
//
// In every case, the first parameter is a pointer to the sqlite3_stmt
// structure returned from sqlite3_prepare(). The second parameter is the
// index of the wildcard. The first "?" has an index of 1. ":N:" wildcards
// use the index N.
//
// The fifth parameter to sqlite3_bind_blob(), sqlite3_bind_text(), and
//sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
//text after SQLite has finished with it. If the fifth argument is the
// special value SQLITE_STATIC, then the library assumes that the information
// is in static, unmanaged space and does not need to be freed. If the
// fifth argument has the value SQLITE_TRANSIENT, then SQLite makes its
// own private copy of the data.
//
// The sqlite3_bind_* routine must be called before sqlite3_step() after
// an sqlite3_prepare() or sqlite3_reset(). Unbound wildcards are interpreted
// as NULL.
//

type
  TSQLite3Destructor = procedure(Ptr: Pointer); cdecl;

function sqlite3_bind_blob(hStmt: TSqliteStmt; ParamNum: integer;
  ptrData: pointer; numBytes: integer; ptrDestructor: TSQLite3Destructor): integer;
cdecl; external SQLiteDLL name 'sqlite3_bind_blob';
function sqlite3_bind_text(hStmt: TSqliteStmt; ParamNum: integer;
  Text: PAnsiChar; numBytes: integer; ptrDestructor: TSQLite3Destructor): integer;
cdecl; external SQLiteDLL name 'sqlite3_bind_text';
function sqlite3_bind_double(hStmt: TSqliteStmt; ParamNum: integer; Data: Double): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_double';
function sqlite3_bind_int(hStmt: TSqLiteStmt; ParamNum: integer; Data: integer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_int';
function sqlite3_bind_int64(hStmt: TSqliteStmt; ParamNum: integer; Data: int64): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_int64';
function sqlite3_bind_null(hStmt: TSqliteStmt; ParamNum: integer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_null';

function sqlite3_bind_parameter_index(hStmt: TSqliteStmt; zName: PAnsiChar): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_parameter_index';
Markus Kinzler
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#9

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:23
Dieser Kommentar steht zwar bei meiner SQLite.pas nicht aber die Funktion sqlite3_prepare ist vorhanden. Werds später ausprobieren. Danke
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: SQL-Statement escapen

  Alt 20. Apr 2009, 14:30
Dann würde ich updatetn. Dieser Kommentar stamt aus der aktuellen Version (gerade heruntergeladen)
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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