使用准备好的语句来设置表名

我试图使用准备语句来设置表名来select数据,但是当我执行查询时,我不断收到错误。

错误和示例代码显示在下面。

[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(); 

有什么想法可能造成这个?

表名不能用作参数。 它必须是硬编码的。 所以你可以做这样的事情:

 private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + "?]"; 

正如一些人所说,你不能使用一个表名的语句参数,只能将variables作为条件的一部分。

基于这个事实,你有一个至less有两个表名的variables表名,也许最好是创build一个方法来获取你正在存储的实体并返回一个准备好的语句。

 PreparedStatement p = createStatement(table); 

这是技术上可行的解决方法,但非常糟糕的做法。

 String sql = "IF ? = 99\n"; sql += "SELECT * FROM first_table\n"; sql += "ELSE\n"; sql += "SELECT * FROM second_table"; PreparedStatement ps = con.prepareStatement(sql); 

然后当你想从first_table中select你设置的参数

 ps.setInt(1, 99); 

或者,如果没有,你把它设置为别的东西。

我不确定你可以使用PreparedStatement来指定表的名字,只是一些字段的值。 无论如何,你可以尝试相同的查询,但没有括号:

 "SELECT plantID, edrman, plant, vaxnode FROM ?" 
 String table="pass"; String st="select * from " + table + " "; PreparedStatement ps=con.prepareStatement(st); ResultSet rs = ps.executeQuery(); 

有一种方法可以将表名称作为variables

String NameOfTable =“test.Employee”;

String Fquery =“SELECT * FROM”+ NameOfTable +“where Done ='No'”;

注意:在FROM和后面的“以及”和where关键字之间应该有一个空格