2012-04-23 217 views
2

我正在生成一个表并将数据插入到该表中。该表是根据具有复杂关系的数据创建的。我们创建了这个功能,因此我们的BI工具的用户可以轻松处理数据。PreparedStatement抛出索引超出范围时,它不超出范围

根据用户生成的数据,我们有一堆创建的表中的每一个都是不同的。在一种情况下,我们正在索引超出范围的例外。在检查元数据时,它没有超出范围。

确切异常消息是:

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

生成的INSERT语句:

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 - int || java.lang.Integer

2 - int || java.lang.Integer

3 - int || java.lang.Integer

4 - datetime || java.sql.Timestamp

5 - datetime || java.sql.Timestamp

6 - nvarchar || java.lang.String

7 - int || java.lang.Integer

8 - nvarchar || java.lang.String

9 - nvarchar || java.lang.String

10 - int || java.lang.Integer

11 - nvarchar || java.lang.String

12 - int || java.lang.Integer

13位|| java.lang.Boolean

当我尝试设置列索引13时,我得到索引超出范围,但根据它存在的元数据!如果它不存在,我会得到另一个超出范围的异常。

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

任何人都可以解释为什么当列索引存在时会发生此错误吗?

+1

您是否尝试使用基于零的索引?如果不是这样,你应该发布你用来构建语句的确切代码并执行它。 – 2012-04-23 12:09:13

+0

@MarkoTopolnik Java的'PreparedStatement'中的索引是基于1的,所以我不认为这是造成问题的原因。 – Jesper 2012-04-23 12:13:16

+0

@Jesper没有任何代码,它是猜测究竟发生了什么。可能会有间歇性代码从1转换为0,或者上帝知道还有什么。 – 2012-04-23 12:16:47

回答

1

我的建议是?相信JVM。这与你的想法无关。

你不是在寻找正确的位置来理解发生了什么问题。编写一个小型自包含的示例并在调试器中运行它。你将能够看到代码出错的地方。

+0

代码错误 - 错误的Prepared Statement对象正在调用setBoolean – Allan 2012-04-23 14:13:41

0

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