Aktuelle Zeit: 09.07.2020 10:13

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 15.12.2019 20:54 
Offline

Registriert: 15.12.2019 16:59
Hallo zusammen,

für eine SQLite DB würde ich gerne einen String als Bindungsvariable mit SetDatabaseString(#Datenbank, StatementIndex, Wert$) festlegen. Bekomme es aber nicht hin und finde den Fehler nicht.

Folgendes funktioniert (ohne String als Bindungsvariable):

Code:
sql = "ALTER TABLE " + table.s + " ADD " + column.s + " " + type.s + " ;"
If DatabaseUpdate(id, sql) <= 0
    Debug "Error in AddColumn Datenbankfehler " + DatabaseError()
EndIf


Folgendes haut nicht hin:

Code:
sql.s = "ALTER TABLE ? ADD ? ?;"
 
  SetDatabaseString(id, 0, table.s)
  SetDatabaseString(id, 1, column.s)
  SetDatabaseString(id, 2, type.s)
 
If DatabaseUpdate(id, sql.s) <= 0
    Debug "Error in AddColumn Datenbankfehler " + DatabaseError()
EndIf


Der DatabaseError() meldet einen Syntax-Fehler in der Nähe von "?"

Ich stehe auf dem Schlauch. Hat jemand eine Idee?

Grüße
Istvan42

_________________
--
Mac OS Catalina, PureBasic 5.71 LTS (MacOS X - x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 16.12.2019 10:42 
Offline
Moderator
Benutzeravatar

Registriert: 15.06.2008 18:22
Wohnort: Dresden
Was steht denn so in table.s, type.s und column.s?

_________________
Win10 x64 | PB 5.71 (x86 und x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 16.12.2019 12:10 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
@Andesdaf:
Es ist erstmal nicht die Tatsache was in table.s, type.s, oder columns.s steht.

Auch wenn da bisher noch nichts selber eingetragen wurde, es sind trotzdem legitime Zeichenketten.

Und was Istvan42 hier macht:

Zitat:
sql.s = "ALTER TABLE ? ADD ? ?;"

SetDatabaseString(id, 0, table.s)
SetDatabaseString(id, 1, column.s)
SetDatabaseString(id, 2, type.s)

If DatabaseUpdate(id, sql.s) <= 0
Debug "Error in AddColumn Datenbankfehler " + DatabaseError()
EndIf


ist doch laut PureBasic-Hilfe vollkommen in Ordnung.

Es geht hierbei um die Tatsache, dass man es einfach nicht so schreiben kann.

Wenn man es so schreibt:

table.s = "food"
column.s = "cookies"
type.s = "CHAR(50)"
sql = "ALTER TABLE " + table + " ADD " + column + " " + type + " ;"

liefert die Funktion: DatabaseUpdate() eine 1

Bei der anderen Variante aber eine 0.

@Istvan42

Die "SetDatabase" Befehle sind eigentlich nur für das Setzen von Werten innerhalb der Datenbank. (Datenbankfelder)

Bei einer normalen Datenbankanweisung musst du eine ganz normale Zeichenkette aus deinen normalen Zeichenketten-Variablen bauen.

_________________
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.2 / Android 7.0 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 16.12.2019 13:21 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
- der erste Query hat ein Space vor dem Semikolon, der zweite nicht.
- Rückgabewert von DatabaseUpdate() ist bei Fehler 0 und nicht <= 0.
- column vs columns.

Leider bekomme ich den Syntax Error trotzdem.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 16.12.2019 13:38 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
ccode_new hat geschrieben:
Die "SetDatabase" Befehle sind eigentlich nur für das Setzen von Werten innerhalb der Datenbank. (Datenbankfelder)

Bei einer normalen Datenbankanweisung musst du eine ganz normale Zeichenkette aus deinen normalen Zeichenketten-Variablen bauen.

Ich glaube da hast du recht:
Zitat:
Generally one cannot use SQL parameters/placeholders for database identifiers (tables, columns, views, schemas, etc.) or database functions (e.g., CURRENT_DATE), but instead only for binding literal values.
SQLite Parameters - Not allowing tablename as parameter

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 16.12.2019 15:21 
Offline
Moderator
Benutzeravatar

Registriert: 15.06.2008 18:22
Wohnort: Dresden
ccode_new hat geschrieben:
Es ist erstmal nicht die Tatsache was in table.s, type.s, oder columns.s steht.

Auch wenn da bisher noch nichts selber eingetragen wurde, es sind trotzdem legitime Zeichenketten.


Ich hatte so einen Fall schon mal vor Jahren, da verhielt sich die Behandlung mit gebundenen Parametern
anders. Ich weiß aber nicht mehr genau, unter welchen Voraussetzungen; hier hast du aber natürlich Recht.
Bindung nur mit "echten" Werten.

_________________
Win10 x64 | PB 5.71 (x86 und x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: String als Bindungsvariable mit SetDatabaseString
BeitragVerfasst: 16.12.2019 18:25 
Offline

Registriert: 15.12.2019 16:59
Hallo zusammen,

wie hier auch schon vermutet wurde, habe ich die Funktion nicht so verwendet, wie es sein soll. Ich reime mir das jetzt so zusammen:

Da die eingegebenen Daten nun als Parameter an die Query übergeben werden, kann kein Teil davon als zusätzliche SQL-Anweisung behandelt werden. Es ist nur eine Übergabe an ein Datenfeld erlaubt und jede "Injektion" ist ungültig. Der Sinn der Verwendung von Variablen-Bindung besteht ja gerade darin SQL-Injection-Angriffe zu vermeiden.

Es können nur Daten, die in einem Datenfeld in der Tabelle einer Datenbank gespeichert werden, mit den Methoden verwendet werden. Nicht aber Ausdrücke, die zum SQL-Befehl gehören. Ein Tabellenname ist beispielsweise kein Datum, der in einem Datenfeld einer Tabelle gespeichert werden soll und kann daher nicht verwendet werden.

Leider gibt der Compiler oder der Debugger keine Fehlermeldung aus, wenn versucht wird, einen Parameter eines SQL-Befehlts statt den Wert eines Datenfeldes mit der SQLite Variabel Bindung zu verwenden.

Erst mit dem Aufruf von DatabaseError() kann man einen Hinweis auf ein Problem erhalten.

Bsp.:

Error in NewTable. Datenbankfehler near "?": syntax error ist aufgetreten.

Ein entsprechender Hinweis mit einem Beispiel in der Doku wäre sicherlich hilfreich, da ich mit meiner Frage nicht alleine bin.

Damit sollte die Ursache für mein Problem geklärt sein, oder gibt es noch Anmerkungen?

Gruß
Istvan42


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 9 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye