Java JDBC PreparedStatement似乎忽略了占位符

Java JDBC PreparedStatement似乎忽略了占位符,java,sql,sqlite,jdbc,Java,Sql,Sqlite,Jdbc,给定PreparedStatement的以下代码,我使用占位符(?)填充字符串: String sql = "SELECT SUM(Premium), SUM(AgentComm)\n" + "FROM \"?_KLCommissions\" \n" + "WHERE AgentCode = \"?\";"; PreparedStatement preparedStatement = conn.prepareStateme

给定
PreparedStatement
的以下代码,我使用占位符(?)填充
字符串

String sql = "SELECT SUM(Premium), SUM(AgentComm)\n" +
                "FROM \"?_KLCommissions\" \n" +
                "WHERE AgentCode = \"?\";";

    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setString(1, year);
    preparedStatement.setString(2, agent.getAgentNumber());

    ResultSet resultSet = preparedStatement.executeQuery();
但是,在执行查询时,我得到一个SQL错误:
没有这样的表:?\u


为什么在处理查询时,
占位符没有被替换?

您在双引号中找到了占位符,这意味着它不是占位符-它只是值的一部分

除此之外,大多数SQL数据库不允许将参数用于表名和列名之类的内容—只有值可以参数化。因此,您可能需要直接构建表名部分,然后使用

WHERE AgentCode = ?
对于代理代码-因此您只需设置一个参数。比如:

String tableName = year + "_KLCommissions";
// TODO: Put validation here unless you already have *complete confidence*
// that the value of "year" can't be messed around with.
String sql = "SELECT SUM(Premium), SUM(AgentComm) " +
             "FROM " + tableName + " " +
             "WHERE AgentCode = ?";

PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, agent.getAgentNumber());
ResultSet resultSet = preparedStatement.executeQuery();

请注意这里的待办事项-您真的不希望用户能够为
提供任意值,因为这样他们可以在您的查询中放入任意SQL。

因此,例如,如果我需要使用不同的年份多次运行该语句,我实际上需要多个语句来代替它?@Zephyr:是的,您会的。请注意,SQLite不允许表名以数字开头,而不使用双引号转义名称。@MickMnemonic我使用单引号以int开头表名;这似乎也很管用。谢谢你,乔恩。我不知道占位符的限制!