【发布时间】: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