2010-08-05 20 views
5

Я выполняю простое выполнение запроса подготовленного запроса и выбрасываю мне эту ошибку: java.sql.SQLException: Использование метода executeQuery (string) не поддерживается в этом типе инструкции в файле net.sourceforge.jtds.jdbc. JtdsPreparedStatement.notSupported (JtdsPreparedStatement.java:197) в net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery (JtdsPreparedStatement.java:822) в testconn.itemcheck (testconn.java:58)java: использование метода executeQuery (string) не поддерживается?

Любые идеи, что я делать неправильно? спасибо заранее вот код:

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 

ответ

5

Несколько вещей, которые стоит проверить:

  1. Используйте другой псевдоним. Использование COUNT в качестве псевдонима будет задавать проблемы.
  2. Объект запроса не должен передаваться дважды, один раз во время подготовки инструкции и позже во время выполнения. Использовать его в con.prepareStatement(query);, т. Е. Подготовка инструкций, достаточно.

ADDENDUM

Сомнительно, что jTDS поддерживает использование метода строк агд для PreparedStatement. Обоснование заключается в том, что PreparedStatement.executeQuery(), по-видимому, реализован, тогда как Statement.executeQuery (String), похоже, был переопределен в PreparedStatement.executeQuery(), чтобы выбросить указанное исключение.

+0

Для второй точки ... даже я сделал ту же ошибку. Спасибо, что сэкономил много времени –

5

Итак ...

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

В отличие от Statement с PreparedStatement вы передаете SQL-запроса при создании его (с помощью Connection объекта). Вы делаете это, но затем вы также передаете его снова, когда вы вызываете executeQuery(query).

Используйте no-arg overload of executeQuery(), определенные для PreparedStatement.

Итак ...

PreparedStatement pstmt = con.prepareStatement(query); 
pstmt.setString(1,itemid); 
java.sql.ResultSet rs = pstmt.executeQuery(); 
Смежные вопросы