2012-01-25 35 views
13

tôi đang cố gắng để có được số lượng hàng Kết quả là thiết lập bởi:rs.last() cho phép hoạt động không hợp lệ cho phía trước chỉ resultset: cuối cùng

rs.last(); 
int row_count = rs.getRow(); 

nhưng im nhận được một lỗi Invalid operation for forward only resultset : last. Tập kết quả là lấy dữ liệu của nó từ một cơ sở dữ liệu Oracle 10g.

Dưới đây là làm thế nào tôi thiết lập kết nối của tôi:

Class.forName("oracle.jdbc.driver.OracleDriver"); 
    String connectionString = "jdbc:oracle:thin:@" + oracle_ip_address + ":" + oracle_db_port + ":" + oracle_db_sid; 
    Connection conn = DriverManager.getConnection(connectionString, oracle_db_username, oracle_db_password); 

Trả lời

23

ResultSet.last() và "tuyệt đối-lập chỉ mục" hoạt động truy vấn chỉ có sẵn khi tập kết quả là cuộn; nếu không, bạn chỉ có thể lặp lại từng cái một thông qua tập hợp kết quả chỉ chuyển tiếp.

Ví dụ sau (từ the javadocs) minh họa cách tạo ResultSet có thể cuộn.

Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_READ_ONLY 
); 
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); 

Hãy nhớ rằng có những tác động về hiệu suất khi sử dụng truy vấn có thể cuộn. Nếu mục tiêu của ResultSet cụ thể này chỉ để lấy giá trị cuối cùng, vui lòng xem xét tinh chỉnh truy vấn của bạn để chỉ trả về kết quả đó.

+2

Theo đặc điểm kỹ thuật mới nhất, chúng tôi có thêm hai tham số với createStatement() - 'Statement statement = con.createStatement (resultSetType, resultSetConcurrency);' như được mô tả bởi má, chúng ta phải truyền 'ResultSet.TYPE_SCROLL_INSENSITIVE' nhưng với điều đó chúng ta cũng phải chuyển một tham số nữa - hãy tham khảo điều này - 'resultSetType một kiểu tập kết quả; một trong ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE hoặc ResultSet.TYPE_SCROLL_SENSITIVE resultSetConcurrency một loại tương tranh; một trong ResultSet.CONCUR_READ_ONLY hoặc ResultSet.CONCUR_UPDATABLE' – OverrockSTAR

+0

Liên kết javadocs bị hỏng – KAD

+0

Hãy giúp tôi nói rằng 'Phương thức createStatement() trong kiểu Connection không áp dụng cho các đối số (int)' khi tôi cố gắng thực hiện 'Statement stmt = con.createStatement ( ResultSet.TYPE_SCROLL_INSENSITIVE ); ' – Squareoot

4
PreparedStatement ps = conn.prepareStatement ("SELECT * FROM 
     EMPLOYEE_TABLE WHERE LASTNAME = ?" , 
     ResultSet.TYPE_SCROLL_INSENSITIVE , 
     ResultSet.CONCUR_UPDATABLE , 
     ResultSet.HOLD_CURSOR_OVER_COMMIT) ; 

Đối với báo cáo chuẩn bị, bạn phải xác định, ở mức tối thiểu, cả hai loại chế độ đồng thời cho last()isLast() để làm việc.

+0

isLast() không yêu cầu con trỏ có thể cuộn được. last() yêu cầu nó. –

0

Nhờ cheeken (2 bài trên), nhưng trong Java 1.8, các createStatement() chức năng cần hiện giờ là 2 thông số

dụ:

stmt 
    = conx.createStatement 
     (ResultSet.TYPE_SCROLL_INSENSITIVE 
     ,ResultSet.CONCUR_READ_ONLY 
    ); 
Các vấn đề liên quan