gpt4 book ai didi

Java PreparedStatement : com. microsoft.sqlserver.jdbc.SQLServerException,索引超出范围

转载 作者:行者123 更新时间:2023-11-29 07:33:42 34 4
gpt4 key购买 nike

我正在尝试使用以下代码在 Java 7 中使用 Java PreparedStatement 执行 SQL 查询:

PreparedStatement functionalCRsStatement = con.prepareStatement(
"select * from openquery(SERVER,\n" +
"\t'Select X , Y, Z, A from D r\n" +
"\tINNER JOIN E c\n" +
"\tON r.RNID = c.RNID\n" +
"\twhere c.Y = ?')\n");

functionalCRsStatement.setString(2, x);

我收到以下错误消息:com.microsoft.sqlserver.jdbc.SQLServerException:索引 2 超出范围。

PS:我确信 SQL 查询的正确性,因为我在没有 PreparedStatement 的情况下成功地测试了它,我只是将查询中的列的真实名称替换为假的 (X, Y, Z) 来隐藏潜在的 secret 信息。

编辑:我在使用 setString(1, x) 时遇到了类似的错误 => index 1 is out of range

最佳答案

正如@JonK 评论的那样,您的查询中有撇号,这意味着您的参数实际上位于 SQL 引擎不会绑定(bind)值的字符串中(无论您使用 1 还是 2 作为索引):

PreparedStatement functionalCRsStatement = con.prepareStatement(
"select * from openquery(APRPRD,\n" +
"\t'Select X , Y, Z, A from D r\n" +
"\tINNER JOIN E c\n" +
"\tON r.RNID = c.RNID\n" +
"\twhere c.Y = ?')\n");

包含此查询(带有 SQL 语法高亮显示,显示整个字符串)

select * from openquery(APRPRD,
'Select X , Y, Z, A from D r
INNER JOIN E c
ON r.RNID = c.RNID
where c.Y = ?')

SQL 引擎从不检查字符串的内部。否则如何插入包含问号的字符串?

关于Java PreparedStatement : com. microsoft.sqlserver.jdbc.SQLServerException,索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38655215/

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