2012-05-16 5 views
6

mam natknąć poniższych kodów czuję, że robi coś złego:setString PreparedStatement (...) dla wszystkich, nawet jeśli corrsponding typ danych jest liczbą całkowitą

(zauważ, że to JDK 1.4.2 dlatego lista nie jest wpisywany)

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

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

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

to co jestem zaniepokojony:

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)); 
} 

ale muszę zaznaczyć, że niektóre z odpowiednich typów danych (pole) w bazie danych są liczbami całkowitymi, i daty, Czy to byłoby w porządku?

+1

Nie sądzę, że jest dobra. Wydaje się, że polega to na niejawnym nawróceniu i często prowadzi do smutku na drodze. – Glenn

+0

Zgaduję, że 'temp' jest' List' - czy jest on generalnie wpisany? Proszę pokazać swoją deklarację. –

+1

@Paul Bellora temp jest ArrayList. I nie jest wpisany, ponieważ jest to Java 1.4 –

Odpowiedz

6

Należy rozważyć użycie metody PreparedStatement setObject() zamiast setString().

PreparedStatement setObject() będzie próbował zamienić dowolny z java.lang rodzajów dla Ciebie, jeśli typ jest znany w czasie kompilacji.

tak ze zaktualizowaną pętli for (zakładając, że masz Java 5.0) i rodzajowe obsługę zerowej:

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() Zauważ, że można zaakceptować type jako 2nd parametru, jeśli jest znana.

+1

Dzięki pd40, zrobiłbym małą notatkę, że setObject byłby przydatny w sytuacjach, gdy typ jest nieznany podczas kompilacji. –

+2

W tym przypadku doskonale jest używać 'setObject()'. Uważaj, nie powinieneś przekazywać typu null do 'setObject()'. +1 –

+0

Dobra uwaga dotycząca przypadku zerowego. Dodam to. Również komentarz o czasie kompilacji. – pd40

0

To mi nie pomogło. Poniżej znajduje się zapytanie zbudowane po dołączeniu zmiennych wiązania. wybierz ACC_NO z ACC_TABLE, gdzie ACC_NAME = 'java.lang.String';

Próbuje przekonwertować typu java.lang.String i co skutkuje następującym wyjątkiem java.sql.SQLException: Nie można wykonać polecenia sql - oryginalne wiadomość: null

przypadku jak mój ACC_NAME jest " user01 '. Tak więc zapytanie powinno być czymś podobnym, wybierz ACC_NO z ACC_TABLE, gdzie ACC_NAME = 'user01';

Więc jeśli moje zrozumienie nie jest błędem, preparedStatement.setObject (index, object) konwertuje dane do odpowiedniego typu danych i ustawia je.

preparedStatement.setObject (indeks, obiekt) w MySQL działa doskonale, bez żadnych problemów. Jedynym problemem jest korzystanie z Oracle. wersja Oracle DB pracuję z jest

Oracle Database 11g Express Edition Release 11.2.0.2.0 - Produkcja PL/SQL Release 11.2.0.2.0 - Produkcja "CORE 11.2.0.2.0 Produkcja" TNS dla 32-bitowego systemu Windows: wersja 11.2.0.2.0 - produkcja NLSRTL wersja 11.2.0.2.0 - produkcja

Powiązane problemy