【问题标题】:PreparedStatement throwing index is out of range when it is not out of rangePreparedStatement 不超出范围时抛出索引超出范围
【发布时间】:2012-05-04 01:05:15
【问题描述】:

我正在生成一个表并将数据插入到该表中。该表是根据具有复杂关系的数据创建的。我们创建了这个,以便我们的 BI 工具的用户可以轻松处理数据。

我们创建了一堆这样的表,每个表都根据用户生成的数据而有所不同。在一种情况下,我们得到索引超出范围异常。检查元数据时,它没有超出范围。

确切的异常消息是:

com.microsoft.sqlserver.jdbc.SQLServerException: The index 13 is out of range.

生成的插入语句为:

INSERT INTO [F22_AF] ([frcId],[eId],[aId],[dateCreated],[DateofThing],[Wasthisaninjury],[Whowainjured],[WhowainjuredFNAME],[WhowainjuredLNAME],[Whatwasinvolved],[WhatwasinvolvedDATA],[WhatOptionsWereAvailable],[AccidentWitnessed]) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)

当事故见证的值被设置时,异常被抛出。当值即将设置时,我打印了列索引和值:

13 : AccidentWitnessed = 假

当它失败时,我从插入语句中打印出元数据并得到:

parameterMetaData.getParameterCount()=13

ColIndex - 类型 ||类

1 - 整数 || java.lang.Integer

2 - 整数 || java.lang.Integer

3 - 整数 || java.lang.Integer

4 - 日期时间 || java.sql.Timestamp

5 - 日期时间 || java.sql.Timestamp

6 - nvarchar || java.lang.String

7 - 整数 || java.lang.Integer

8 - nvarchar || java.lang.String

9 - nvarchar || java.lang.String

10 - 整数 || java.lang.Integer

11 - nvarchar || java.lang.String

12 - 整数 || java.lang.Integer

13 位 || java.lang.Boolean

当我尝试设置 col index 13 时,我得到 Index Out Of Range,但是根据元数据它存在!如果它不存在,我会得到另一个超出范围的异常。

相同的代码适用于不同的数据集。

谁能解释一下当列索引存在时为什么会出现这个错误?

【问题讨论】:

  • 您尝试过从零开始的索引吗?如果不是这样,您应该发布用于构建语句并执行它的确切代码。
  • @MarkoTopolnik Java 的 PreparedStatement 中的索引是从 1 开始的,所以我不认为这是问题的原因。
  • @Jesper 没有任何代码,这只是猜测到底发生了什么。可能会有间歇性的代码从 1 转换为 0,或者天知道还有什么。
  • 你能给我们提供你用来填写你的陈述的案例吗,比如statement.setObject(13,...)
  • 那么字段定义肯定有问题。如果无法纠正(TINYINT(1)?),那么您可以使用 getObject 执行 SELECT 查询并检查 java getClass()。

标签: java sql-server jdbc


【解决方案1】:

我的建议?相信 JVM。不管你怎么想。

您没有找到正确的位置来了解问题所在。编写一个小的、独立的示例并在调试器中运行它。这样你就可以看到代码哪里出错了。

【讨论】:

  • 代码错误 - 错误的 Prepared Statement 对象正在调用 setBoolean
【解决方案2】:

当我使用Hibernate 时,我也发生了同样的错误。但是异常不依赖于休眠。此异常取决于JDBCDatabase 版本。在我的数据库中是oracle 并得到了相同的异常。原因是我使用的ojdbc 错误。在Prepared Statement 中,如果我传递了超过 7 个参数,我得到了异常。这是一个错误。解决方案正在更改ojdbc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多