2010-08-05 30 views
5

Tôi đang thực hiện truy vấn chuẩn bị đơn giản và ném cho tôi lỗi này: java.sql.SQLException: Việc sử dụng phương thức executeQuery (string) không được hỗ trợ trên loại câu lệnh này tại net.sourceforge.jtds.jdbc. JtdsPreparedStatement.notSupported (JtdsPreparedStatement.java:197) tại net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery (JtdsPreparedStatement.java:822) tại testconn.itemcheck (testconn.java:58)java: sử dụng phương thức executeQuery (string) không được hỗ trợ lỗi?

Bất kỳ ý tưởng những gì tôi làm không chính xác? cảm ơn trước đây là mã:

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 

Trả lời

5

Một vài điều có giá trị kiểm tra:

  1. Sử dụng một bí danh khác nhau. Sử dụng COUNT làm bí danh sẽ yêu cầu sự cố.
  2. Đối tượng truy vấn không cần phải vượt qua hai lần, một lần trong quá trình chuẩn bị câu lệnh và sau đó trong khi thực thi. Sử dụng nó trong con.prepareStatement(query); tức là chuẩn bị tuyên bố, là đủ.

PHỤ LỤC

Đó là nghi ngờ rằng jTDS hỗ trợ việc sử dụng các phương pháp Chuỗi arg cho PreparedStatement. Lý do là PreparedStatement.executeQuery() dường như được thực hiện, trong khi Statement.executeQuery (String) dường như đã được overriden trong PreparedStatement.executeQuery() để ném ngoại lệ đã nêu.

+0

Đối với điểm thứ hai ... thậm chí tôi đã phạm sai lầm tương tự. Cảm ơn bạn đã tiết kiệm rất nhiều thời gian của tôi –

5

Vậy ...

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

Không giống như Statement, với PreparedStatement bạn vượt qua sql truy vấn khi bạn tạo ra nó (thông qua các đối tượng Connection). Bạn đang làm điều đó, nhưng sau đó bạn cũng chuyển nó một lần nữa, khi bạn gọi executeQuery(query).

Sử dụng no-arg overload of executeQuery() được xác định cho PreparedStatement.

Vậy ...

PreparedStatement pstmt = con.prepareStatement(query); 
pstmt.setString(1,itemid); 
java.sql.ResultSet rs = pstmt.executeQuery(); 
Các vấn đề liên quan