gpt4 book ai didi

java - JDBCPreparedStatement 似乎忽略占位符

转载 作者:行者123 更新时间:2023-11-30 02:22:50 27 4
gpt4 key购买 nike

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

但是,在执行查询时,我收到 SQL 错误:no such table: ?_KLCommissions

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

最佳答案

它用双引号括起来,这意味着它不是占位符 - 它只是值的一部分。

除此之外,大多数 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();

请注意此处的 TODO - 您确实不希望用户能够为 year 提供任意值,因为这样他们就可以在您的查询中放入任意 SQL。

关于java - JDBCPreparedStatement 似乎忽略占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46369950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com