2012-05-16 21 views
6

我所遇到下列代碼我覺得這是在做錯誤的事情:的PreparedStatement了setString(...)所有,即使造成相應的數據類型爲整數

(注意,這是JDK 1.4.2因此列表中沒有鍵入)

StringBuffer queryBuffer = new StringBuffer(); 
ArrayList temp = new ArrayList(); 

... 
queryBuffer.append("and sb.POSTCODE = ? "); 
temp.add(postcode); 
... 

conn = ConnectionManager.getConnection();  
pstmt = conn.prepareStatement(queryBuffer.toString()); 

這就是我所關心的:

for(int i=0; i<temp.size(); i++) { 
    log.debug("setString("+ (i+1) + "," + (String)temp.get(i) + ")"); 
    pstmt.setString(i+1, (String)temp.get(i)); 
} 

但我必須指出的是,一些在數據庫中的相應數據類型(場)都是整數,和日期,這會好嗎?

+1

我不認爲它是好的。似乎這是依賴於隱式轉換,而這往往會導致悲痛。 – Glenn

+0

我猜'temp'是一個'List' - 是一般的輸入嗎?請顯示其聲明。 –

+1

@Paul Bellora temp是一個ArrayList。它沒有鍵入,因爲這是Java 1.4 –

回答

6

考慮使用PreparedStatement setObject()方法而不是setString()

PreparedStatement的的setObject()將嘗試轉換任何java.lang中的類型適合你,如果類型是在編譯時未知。所以用一個更新的循環

(假設你有Java 5.0中)和通用空處理:

int i = 0; 
for(Object value : temp) { 
    if (value == null) { 
     // set null parameter if value type is null and type is unknown 
     pstmt.setNull(++i, Integer.MIN_VALUE); 
    } else { 
     pstmt.setObject(++i, value); 
    } 
} 

注意setNull()可以接受type爲第二個參數,如果它是已知的。

+1

感謝pd40,我會做一個小小的提示,說明setObject在編譯期間類型未知的情況下會很有用。 –

+2

在這種情況下使用'setObject()'是很好的。當心,你不應該將無類型的'null'傳遞給'setObject()'。 +1 –

+0

關於空情況的好處。我會補充一點。還有關於編譯時間的註釋。 – pd40

0

這並沒有幫助我。 下面是追加綁定變量後構建的查詢。 從ACC_TABLE中選擇ACC_NO,其中ACC_NAME ='java.lang.String';

它試圖轉換爲java.lang.String類型,這將導致以下異常 值java.sql.SQLException:無法執行SQL命令 - 原始消息:空

凡爲我的ACC_NAME是'用戶01' 。 所以實際上查詢應該是這樣的, 從ACC_TABLE中選擇ACC_NO,其中ACC_NAME ='user01';

因此,如果我的理解沒有錯,prepareStatement.setObject(index,object)會將數據轉換爲其各自的數據類型並進行設置。

MySQL中的preparedStatement.setObject(index,object)工作完全正常,沒有問題。 使用Oracle時唯一的問題是。 Oracle數據庫版本,我跟工作是

Oracle數據庫11g快捷版發佈11.2.0.2.0 - 生產 PL/SQL發佈11.2.0.2.0 - 生產 「核心11.2.0.2.0生產」 TNS對於32位Windows:版本11.2.0.2.0 - 生產 NLSRTL版本11.2.0.2.0 - 生產

相關問題