使用预准备语句设置表名

2022-09-01 10:55:17

我正在尝试使用预准备语句来设置要从中选择数据的表名,但是在执行查询时不断收到错误。

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

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

关于可能导致这种情况的原因的任何想法?


答案 1

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

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

答案 2

这在技术上可以通过解决方法实现,但非常糟糕的做法。

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时,您可以使用

ps.setInt(1, 99);

或者,如果没有,则将其设置为其他内容。


推荐