2016-07-29 190 views
0

我試圖在Java 7中使用Java PreparedStatement使用下面的代碼執行SQL查詢:的Java的PreparedStatement:com.microsoft.sqlserver.jdbc.SQLServerException,指數超出範圍

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: The index 2 is out of range.

PS:我確信SQL查詢的正確性,因爲我成功地在沒有PreparedStatement的情況下對其進行測試,我只是用僞造的字符串替換了查詢中列的真實名稱(X, Y,Z)隱藏潛在的機密信息。

編輯:使用setString(1, x) =>index 1 is out of range

+0

您試圖設置第二個參數的值,但您只有一個需要設置的參數。另外,'st'的目的是什麼?你似乎沒有做任何事情。您也不需要在準備好的語句中「美化」SQL - 從代碼的角度輕鬆讀取,而不用亂七八糟的標籤和換行符亂扔查詢字符串。 – JonK

+0

'索引2超出範圍'解釋它。你應該用'1'來代替。 – Abubakkar

+0

我實際上首先嚐試了'1',並且得到了同樣的錯誤'索引1超出範圍' – Platus

回答

1

時,你似乎只有在你的聲明一個?我收到了類似的錯誤,所以你不能到第二索引的引用(2)因爲就像它說的那樣,它已經超出了範圍。

你應該使用

functionalCRsStatement.setString(1, x); 
1

您在查詢中只有一個綁定變量佔位符(?) - 所以你應該用1指數,不2將其綁定:

functionalCRsStatement.setString(1, x); // Was 2 in the OP 
0

你只有一個參數需要在準備好的語句中設置。在準備好的語句中設置參數的set方法檢查準備好的語句中的?的索引,並相應地將該值設置爲準備好的語句。

所以你的情況只有1 ?所以值的數組準備好的語句傳遞是1,你正試圖指數在傳遞值2,因此它說的

索引2超出範圍。

請嘗試與索引1相同,因爲您只有1個參數需要設置。

例如functionalCRsStatement.setString(1,x);

記住值x將被存儲到準備好的語句中第一個索引處的?

編輯:還記得要傳遞的值的類型。如果您將X的值設置爲int,則需要調用setInt(1,x)。在這種情況下,它將無法找到第一個索引os字符串並拋出索引超出範圍的錯誤。

+1

已經有編輯問題,他有'setString(1,x)' – Hrabosch

+0

同樣的錯誤什麼是x的值? –

+0

這不是我的問題;) – Hrabosch

0

準備的語句不能識別任何參數,因爲這個查詢包含0個參數,因爲錯誤的字符串;試試這個:

PreparedStatement functionalCRsStatement = con.prepareStatement(
    "select * from openquery(APRPRD," + 
    "'Select X , Y, Z, A from D r" + 
    "INNER JOIN E c" + 
    "ON r.RNID = c.RNID ')" + 
    "where c.Y = ?"); 
1

由於@JonK評論,你有撇號在您的查詢,這意味着你的參數實際上是在SQL引擎將不綁定一個值(無論你用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發動機從不檢查字符串的內部。你會如何插入一個包含問號的字符串呢?

+0

所以你說沒有解決方案? – Platus

+0

如果您將查詢作爲字符串提供,則必須完整:您必須連接值,這意味着管理字符串參數的引號等。根據字符串來自哪裏,棘手問題。另請參閱[此SO問題](https://stackoverflow.com/q/3378496/1350869)。 –