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

标签 java sql sql-server jdbc

我正在尝试使用以下代码在 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/

相关文章:

java - 使用版本控制保存java对象树?

java - 登录和访问类(class)?

java - 检查 MySQL 中的重复插入

sql - 从 Postgres 中的复合类型数组中进行选择

sql - SQL Server 中等效的 CURSOR 函数

SQL查询以获取已注册英语或乌尔都语类(class)但未同时注册的学生

c# - 在 C# 中以管理员权限启动程序

sql - 通过 Oracle SQL 检索范围内的数字

SQL 查询性能的降低取决于搜索值的顺序

sql-server - 即使 SET PARSEONLY 设置为 ON,SQL Server 也会插入值