2014-01-12 53 views
0

我執行這個查詢:java的公共dbutils:多部分標識符無法綁定

SELECT psq_id, question_text 
FROM presales_question 
WHERE psq_id IN(SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = 1) 

當我在SQL Server Management Studio中直接執行它,它的工作原理。
當我使用標準Java語句&結果集執行它時,它可以工作。
當我使用執行它Apache Commons DBUtils library(V 1.5),我得到:

Exception in thread "main" java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "zz.ps_id" could not be bound. Query: SELECT psq_id, question_text FROM presales_question WHERE psq_id IN(SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ?) Parameters: [1] 
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:363) 
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:350) 
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:211) 

看來問題是不是與查詢,但與dbutils庫。挖掘源代碼,我發現當dbutils調用Statement的getParameterMetaData()方法時會拋出錯誤。我仍然不確定如何解決這個問題。

我的臨時解決方案是編輯dbutils庫的源代碼並禁用對getParameterMetaData()的調用(請參閱AbstractQueryRunner.java的第196行)。它所做的只是檢查傳入的參數計數是否與查詢中發現的值相匹配,並在!=時拋出錯誤。我可以跳過該檢查,因爲如果參數不匹配,查詢無論如何都會失敗。

+0

檢查你的jdbc驅動程序,使用最新的libs。 – MrSimpleMind

+0

我有最新的sqljdbc4.jar驅動程序。就像我說的那樣,查詢本身起作用。問題是getParameterMetaData()拋出一個錯誤。 – bradvido

回答

1

查詢不同,請檢查表名並重新嘗試。

SELECT psq_id, text 
FROM ps_question 
WHERE psq_id IN (
    SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = 1 
) 

和一個失敗

SELECT psq_id, question_text 
FROM presales_question 
WHERE psq_id IN (
    SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ? 
) 
  1. 你必須在第一個文本和QUESTION_TEXT在未來。
  2. 表名是第一個查詢中的ps_question和另一箇中的presales_question。

100%確定查詢正常,您不需要表zz的任何別名。你可以刪除這些細節。


可能是您使用的舊的jdbc驅動程序。

下載最新的驅動程序,

http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774


儘量給1並再次運行查詢,它運行?還是會失敗?

更改?到1

SELECT psq_id, question_text FROM presales_question 
WHERE psq_id IN (
    SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ? <-- change 1 
) 
+0

不同的參數只是我試圖簡化查詢名稱,當我發佈它。 我有MS的最新驅動程序。 更改1沒有幫助。 – bradvido

+0

我添加了zz別名來做一些故障排除。我明白這不是必要的,但沒有它我會得到同樣的錯誤。 – bradvido

+0

是簡單的查詢工作。任何從單個表中選擇(不使用連接或嵌套選擇)的工作。 – bradvido