Mit Prepared Statements zu Tabelle set Name
Ich versuche, die Verwendung von vorbereiteten Anweisungen zum festlegen einer Tabelle Namen wählen Daten aus, aber ich erhalte eine Fehlermeldung, wenn ich die Abfrage ausführen.
Den Fehler und Beispiel-code unten angezeigt wird.
[Microsoft][ODBC Microsoft Access Driver] Parameter 'Pa_RaM000' specified where a table name is required.
private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [?]"; //?=date
public Execute(String reportDate){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(Display.DB_MERC);
PreparedStatement st = conn.prepareStatement(query1);
st.setString(1, reportDate);
ResultSet rs = st.executeQuery();
Irgendwelche Gedanken auf, was könnte die Ursache sein?
Ja, input sanitization, um zu verhindern, dass SQL-Injektionen!
Wenn Sie brauchen, um Ersatz verschiedene Tabellennamen in einer Abfrage mit der gleichen Struktur weist es auf einen Fehler in deiner Datenbank-design. Zumindest weist es auf mehrere Tabellen mit der selben relation Attribute. Die Normalisierung der es in einer einzigen Tabelle mit einer "Betreff-Spalte".
Wenn Sie brauchen, um Ersatz verschiedene Tabellennamen in einer Abfrage mit der gleichen Struktur weist es auf einen Fehler in deiner Datenbank-design. Zumindest weist es auf mehrere Tabellen mit der selben relation Attribute. Die Normalisierung der es in einer einzigen Tabelle mit einer "Betreff-Spalte".
InformationsquelleAutor Brandon | 2009-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Namen einer Tabelle kann nicht als parameter verwendet werden. Es muss hart codiert. So etwas wie:
verwenden
org.apache.commons.lang.StringEscapeUtils.escapeSql
auf den Namen der Tabelle, um sicherzustellen, dass Sie nicht setzen Sie Ihr schema in Gefahr.was die string-Verkettung der tablename: DONT do it. Diese geben Weg, um SQL-Injektionen - die Nr. 1 in Angriff OWASPs Top 10 (siehe owasp.org/index.php/Top_10_2013-Top_10)
Es geht ohne sagen, dass, wenn Sie gehen, um dies zu tun, dann der Tabellenname muss in der Whitelist (und sollten Sie den Wert verwenden, der von der whitelist nicht der eingegebene Wert, nur um sicher zu sein; regexes etc)
Verwenden Sie nicht
org.apache.commons.lang.StringEscapeUtils.escapeSql
. Es war deprecated in commons.lang3, und in jedem Fall ersetzt nur single-Angebote mit Doppel-single-quotes. Es nicht verhindern, dass SQL-injection. Siehe commons.apache.org/proper/commons-lang/article3_0.html und commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/....InformationsquelleAutor camickr
Dies ist technisch möglich mit einem workaround, aber sehr schlechte Praxis.
Dann, wenn Sie wollen, wählen Sie aus first_table Sie den parameter mit
Oder, wenn nicht, setzen Sie ihn auf etwas anderes.
InformationsquelleAutor mypetlion
Als eine Reihe von Leute haben gesagt, Sie können nicht, verwenden Sie eine Anweisung parameter für den Namen einer Tabelle, nur für Variablen als Teil der Bedingung.
Basiert auf der Tatsache, Sie haben eine variable table-name mit (mindestens) zwei Tabellennamen, vielleicht wäre es am besten, um eine Methode zu erstellen, welche die Entität, die Sie speichern, und gibt eine vorbereitete Anweisung.
InformationsquelleAutor Damien Allison
Ich bin nicht sicher, dass Sie können verwenden Sie ein PreparedStatement-geben Sie den Namen der Tabelle, einfach den Wert einiger Felder. Sowieso, Sie könnten versuchen, die gleiche Abfrage, aber ohne die Klammern:
InformationsquelleAutor Pierre
Anfällig für SQL-injection. Tun Sie das NICHT!
InformationsquelleAutor Anoop
Es ist ein Weg, um pass Tabellenname als variable
String NameOfTable=" - test.Mitarbeiter";
String Fquery="SELECT * FROM "+NameOfTable+" where Erledigt='Nein'";
Hinweis:
es sollte ein Raum zwischen AUS-und die gelingt "und auch zwischen" und wo keyword
InformationsquelleAutor Vivek Bhardwaj