2010-08-05 11 views
5

Wykonuję proste wykonanie kwerendy przygotowań i rzuca mi ten błąd: java.sql.SQLException: Użycie metody executeQuery (string) nie jest obsługiwane dla tego typu instrukcji w net.sourceforge.jtds.jdbc. JtdsPreparedStatement.notSupported (JtdsPreparedStatement.java:197) w net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery (JtdsPreparedStatement.java:822) w testconn.itemcheck (testconn.java:58)java: użycie metody executeQuery (string) nie jest obsługiwane?

pomysłów, co mam robi nieprawidłowo? z góry dzięki Oto kod:

private static int itemcheck (String itemid) { 
    String query; 
    int count = 0; 
    try { 
    Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
     con = java.sql.DriverManager.getConnection(getConnectionUrl2()); 
    con.setAutoCommit(false); 
    query = "select count(*) as itemcount from timitem where itemid like ?"; 

    //PreparedStatement pstmt = con.prepareStatement(query); 
    //pstmt.executeUpdate(); 

    PreparedStatement pstmt = con.prepareStatement(query); 
    pstmt.setString(1,itemid); 
    java.sql.ResultSet rs = pstmt.executeQuery(); 



    while (rs.next()) { 
    count = rs.getInt(1); 
    System.out.println(count); 
    } //end while 



    }catch(Exception e){ e.printStackTrace(); } 

    return (count); 

} //end itemcheck 

Odpowiedz

5

Kilka rzeczy są warte sprawdzanie:

  1. Korzystanie inny alias. Używanie COUNT jako aliasu wymagałoby kłopotów.
  2. Obiekt zapytania nie musi być przekazywany dwukrotnie, raz podczas przygotowywania instrukcji, a później podczas wykonywania. Używanie go w con.prepareStatement(query);, tj. Przygotowanie oświadczenia, jest wystarczające.

DODATEK

To wątpliwe, że jTDS wspiera wykorzystanie metody arg String dla PreparedStatement. Uzasadnieniem jest to, że PreparedStatement.executeQuery() wydaje się być zaimplementowany, podczas gdy Statement.executeQuery (String) wydaje się być przesłonięte w PreparedStatement.executeQuery(), aby rzucić podany wyjątek.

+0

Na drugim miejscu ... nawet zrobiłem ten sam błąd. Dzięki, że zaoszczędziłeś dużo mojego czasu –

5

Więc ...

PreparedStatement pstmt = con.prepareStatement(query); 
pstmt.setString(1,itemid); 
java.sql.ResultSet rs = pstmt.executeQuery(query); 

przeciwieństwie Statement z PreparedStatement zdać Zapytań SQL podczas tworzenia go (za pośrednictwem obiektu Connection). Robisz to, ale potem także przekazujesz to ponownie, dzwoniąc pod numer executeQuery(query).

Użyj wartości no-arg overload of executeQuery() zdefiniowanej dla PreparedStatement.

Więc ...

PreparedStatement pstmt = con.prepareStatement(query); 
pstmt.setString(1,itemid); 
java.sql.ResultSet rs = pstmt.executeQuery(); 
Powiązane problemy