简体   繁体   English

JDBC PreparedStatement似乎忽略了占位符

[英]JDBC PreparedStatement Seems to Ignore Placeholder

Given the following code for a PreparedStatement , I use a placeholder (?) to be filled with a String : 给定PreparedStatement的以下代码,我使用占位符(?)填充String

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

When executing the query, however, I get a SQL error: no such table: ?_KLCommissions . 但是,执行查询时,出现SQL错误: no such table: ?_KLCommissions

Why is the ? 为什么是? placeholder not being replaced when processing the query? 处理查询时不替换占位符?

You've got it within double-quotes, which means it isn't a placeholder - it's just part of the value. 您已将其放在双引号中,这意味着它不是占位符-它只是值的一部分。

Beyond that, most SQL databases don't let you use parameters for things like table names and column names - only values can be parameterised. 除此之外, 大多数 SQL数据库不允许您将参数用于表名和列名之类的东西-只能对进行参数化。 So you may well need to build the table name part directly, but then use 因此,您可能需要直接构建表名部分,然后再使用

WHERE AgentCode = ?

for the agent code - so you'll only have a single parameter to set. 代理代码-这样您就只能设置一个参数。 So something like: 所以像这样:

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

Note the TODO there - you really don't want users to be able to provide an arbitrary value for year , as then they could put arbitrary SQL in your query. 请注意此处的TODO-您确实不希望用户能够为year提供任意值,因为那样他们就可以在查询中输入任意SQL。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM