2010-05-26 17 views
10

Ich versuche, ein PreparedStatement mit Code ähnlich wie diese verwenden:PreparedStatement.setString() -Methode ohne Anführungszeichen

SELECT * FROM ? WHERE name = ? 

Offensichtlich was passiert, wenn ich setString() verwenden, die Tabelle und Namensfeld gesetzt ist dies:

SELECT * FROM 'my_table' WHERE name = 'whatever' 

und die Abfrage funktioniert nicht. Gibt es eine Möglichkeit, den String ohne Anführungszeichen zu setzen, so dass die Zeile wie folgt aussieht:

SELECT * FROM my_table WHERE name = 'whatever' 

oder soll ich es einfach aufgeben und die regelmäßige Erklärung anstelle (die Argumente aus einem anderen Teil des Systems kommen, weder von diese werden von einem Benutzer eingegeben)?

+0

Die Tatsache, dass Sie beabsichtigen, dies zu tun mir schlägt vor, dass Sie Ihre Daten Umbau berücksichtigen sollten. Vielleicht sollten Sie eine Ansicht erstellen, die alle Tabellen zusammenführt, wobei eine hinzugefügte Spalte der 'Tabellenname' ist. – nsayer

Antwort

15

Parameter können nicht zur Parametrisierung der Tabelle oder zur Parametrisierung von Datenbankobjekten verwendet werden. Sie werden hauptsächlich zur Parametrisierung von WHERE/HAVING-Klauseln verwendet.

Um zu tun, was Sie wollen, müssen Sie die Substitution selbst durchführen und eine reguläre Anweisung nach Bedarf erstellen.

Wenn Sie eine vorbereitete Anweisung verwenden, ist dies ein Hinweis für die Datenbank, die eine Front-up-Verarbeitung der Anweisung durchführt - z. Parsen Sie die Zeichenfolge und bestimmen Sie möglicherweise einen Ausführungsplan. Wenn sich die Objekte, die in der Abfrage verwendet werden, dynamisch ändern können, konnte die Datenbank nicht viel Vorbereitung vorbereiten.

+0

Um dies weiter zu verbessern, ist es nicht so, dass die Verwendung von setString die Strings in Anführungszeichen setzt, weil dies nicht der Fall ist (Bind-Variablen funktionieren nicht auf diese Weise). Es ist nur so, dass Sie für diesen Teil der Abfrage keine Variable verwenden können. – Donnie

+0

Bekam es, danke! Würden Sie sagen, PreparedStatement ist hier nicht sinnvoll, wenn die Parameter nicht vom Benutzer eingegeben werden? Ich meine, es ist wahrscheinlich teurer im Vergleich zu regulären Statement. Oder sollte ich PreparedStatement überall verwenden, egal was? – Slavko

+1

Sie können immer noch ein PreparedStatement verwenden, versuchen Sie nicht, den Tabellennamen zu parametrisieren - parametrieren Sie den 'wer auch immer'. Es gibt eine Debatte über die Verwendung von vorbereiteten vs. regelmäßigen Aussagen, aber ich glaube, der Konsens besteht darin, vorbereitete Aussagen zu verwenden, es sei denn, Sie entdecken gute Gründe dafür. – mdma

2

Leider können Sie Tabellennamen für vorbereitete Anweisungen nicht parametrisieren. Falls gewünscht, könnten Sie einen String konstruieren und als dynamisches SQL ausführen.

3

Ich bezweifle, dass Ihr SQL auf diese Weise wirklich unendlich flexibel ist. Sie haben nur eine endliche Anzahl von Tabellen, also ist die Anzahl der statischen End-Strings, um das benötigte SQL auszudrücken, auch endlich.

Verwenden Sie weiterhin PreparedStatement und binden Sie Ihre Variablen. Es ist es absolut wert, besonders hilfreich bei der Vermeidung von SQL-Injection-Problemen.

+0

Sie haben offensichtlich nicht genug gelesen TheDailywtf.com. Einen Tisch pro Kunde zu haben (und die Anzahl der Kunden sind nicht gebunden) ist ein gebrauchtes Anti-Muster. –

+0

Offenbar nicht. Danke für die Köpfe hoch. 8) – duffymo

2

Der Fehler, den Sie gemacht haben, ist, dass Sie den Tabellenname nicht als Parameter übergeben können. Sie sollten die Werte nur an eine SQL-Anweisung übergeben.

Ex: Wenn Sie wantto:

Select * from LoggedUsers where username='whatever' and privilege='whatever'; 

dann haben Sie die PreparedStatement zu bauen:

Select * from LoggedUsers where username=? and privilege=? 

setString(1, usernameObject); 
setString(2, privilegeObject); 

Der Zweck PreparedStatement ist die Schwierigkeit und die Lesbarkeit zu reduzieren der Datenbankverbindungscode Wenn der Entwickler so viele Spaltenwerte mit der Statement-Instanz verwenden muss, ist es so schwierig, Semikolons, Kommas und Pluszeichen (concat operator) zu setzen.

Ich glaube, Sie versehentlich nutzen Sie es wollten, die entworfen, um nicht zu sein ....

Verwandte Themen