2012-04-23 260 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