Nếu một câu lệnh có thể trả về không hoặc nhiều kết quả, bạn không nên sử dụng executeQuery
, nhưng execute()
thay vào đó, phương thức này trả về một boolean
cho biết loại kết quả đầu tiên:
-
true
:kết quả là mộtResultSet
-
false
:kết quả là số lần cập nhật
Nếu kết quả là true
, sau đó bạn sử dụng getResultSet()
để truy xuất ResultSet
, nếu không thì getUpdateCount()
để truy xuất số lượng cập nhật. Nếu số bản cập nhật là -1
nó có nghĩa là không có kết quả nào nữa. Lưu ý rằng số lượng cập nhật cũng sẽ là -1
khi kết quả hiện tại là ResultSet
. Bạn cũng nên biết rằng getResultSet()
sẽ trả về null nếu không còn kết quả nào nữa hoặc nếu kết quả là số lần cập nhật.
Bây giờ nếu bạn muốn lấy thêm kết quả, bạn gọi getMoreResults()
(hoặc anh trai của nó chấp nhận một int
tham số). Giá trị trả về của boolean
có cùng ý nghĩa với nghĩa của execute()
, vì vậy false
không có nghĩa là không có thêm kết quả!
Chỉ không có kết quả nào nữa nếu getMoreResults()
trả về false và getUpdateCount()
trả về -1
(cũng được ghi lại trong Javadoc)
Về cơ bản, điều này có nghĩa là nếu bạn muốn xử lý chính xác tất cả các kết quả, bạn cần thực hiện một số việc như sau:
boolean result = stmt.execute(...);
while(true)
if (result) {
ResultSet rs = stmt.getResultSet();
// Do something with resultset ...
} else {
int updateCount = stmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// Do something with update count ...
}
result = stmt.getMoreResults();
}
LƯU Ý:Một phần của câu trả lời này dựa trên câu trả lời của tôi cho Java SQL:Statement.hasResultSet ()?