2010-08-05 8 views
5

Estoy haciendo una ejecución de consulta simple preparedstatement y me lanza este error: java.sql.SQLException: El uso del método executeQuery (cadena) no se admite en este tipo de instrucción en net.sourceforge.jtds.jdbc. JtdsPreparedStatement.notSupported (JtdsPreparedStatement.java:197) en net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery (JtdsPreparedStatement.java:822) en testconn.itemcheck (testconn.java:58)java: uso de método executeQuery (cadena) ¿error no soportado?

¿Alguna idea de lo que estoy haciendo incorrectamente? gracias de antemano aquí está el código:

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 

Respuesta

5

Un par de cosas vale la pena echarle:

  1. Utilice un alias diferente. Usar COUNT como alias sería pedir problemas.
  2. El objeto de consulta no necesita pasar dos veces, una durante la preparación de la instrucción y más tarde durante la ejecución. Usarlo en con.prepareStatement(query); es decir, preparación de la declaración, es suficiente.

ADDENDUM

Es dudoso que jTDS apoya el uso del método de cadena arg para PreparedStatement. El razonamiento es que PreparedStatement.executeQuery() parece estar implementado, mientras que Statement.executeQuery (String) parece haber sido anulado en PreparedStatement.executeQuery() para arrojar la excepción establecida.

+0

Por segundo punto ... Incluso me hicieron el mismo error. Gracias, ahorraste mucho tiempo –

5

Entonces ...

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

A diferencia de Statement, con PreparedStatement que pase la consulta SQL cuando se crea (a través del objeto Connection). Lo estás haciendo, pero también lo estás pasando de nuevo, cuando llamas al executeQuery(query).

Utilice el no-arg overload of executeQuery() definido para PreparedStatement.

Entonces ...

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