Sonuç kümesi için hasNext yöntemi yoktur. ResultsSet öğesinin herhangi bir değeri olup olmadığını kontrol etmek istiyorum
bu doğru yol mu
if (!resultSet.next() ) {
System.out.println("no data");
}
Sonuç kümesi için hasNext yöntemi yoktur. ResultsSet öğesinin herhangi bir değeri olup olmadığını kontrol etmek istiyorum
bu doğru yol mu
if (!resultSet.next() ) {
System.out.println("no data");
}
Yanıtlar:
Bu doğru, başlangıçta ResultSet
'imleci ilk satırdan önce işaret ediyor, eğer ilk next()
geri dönüş çağrısı varsa false
,ResultSet
.
Bu yöntemi kullanırsanız, beforeFirst()
kendisini ilk satırdan sonra konumlandırdığından, sıfırlamak için hemen .
Bununla birlikte, Seifer'in aşağıdaki cevabının bu soruya daha zarif bir çözüm olduğu belirtilmelidir.
isBeforeFirst()
, imleci ilerletmeden döndürülen herhangi bir satır olup olmadığını test etmek için arayabilirsiniz , ardından normal şekilde devam edin.
ResultSet
İmleci ilk satırdan önce işaret eden yeni döndürülmüş bir ile çalıştığınızı varsayarsak , bunu kontrol etmenin daha kolay bir yolu sadece aramaktır isBeforeFirst()
. Bu, verinin okunması durumunda geri takip etmek zorunda kalmaz.
Belgelerde açıklandığı gibi , imleç ilk kayıttan önce değilse veya ResultSet içinde hiç satır yoksa bu false değerini döndürür .
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
Genellikle böyle bir şey yapardınız:
while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}
Boş bir kümeyi bildirmek istiyorsanız, okunan öğeleri sayan bir değişken ekleyin. Yalnızca tek bir öğeyi okumanız gerekiyorsa, kodunuz yeterlidir.
Sonuç kümesinin boş olduğundan veya imleç konumundan bağımsız olarak tamamen olmadığından emin olmak için şöyle bir şey yaparım:
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}
Bu işlev ResultSet boşsa true, değilse false döndürür veya ResultSet kapalı / başlatılmamışsa SQLException atar.
ResultSet.next () yöntemini bunun için do {...} while () sözdizimi ile birlikte kullanmak en iyisidir.
"Herhangi bir sonucu denetle" çağrısı ResultSet.next () yöntemini imleci ilk satıra taşır, bu nedenle döngü tarafından döndürülen kalan satırları işlemeye devam ederken o satırı işlemek için do {...} while () sözdizimini kullanın.
Bu şekilde sonuçları kontrol edersiniz, aynı zamanda döndürülen sonuçları da işlersiniz.
if(resultSet.next()) { // Checks for any results and moves cursor to first row,
do { // Use 'do...while' to process the first row, while continuing to process remaining rows
} while (resultSet.next());
}
En uygun cevaba göre öneri "isBeforeFirst ()" kullanmaktır. "Yalnızca ileri tür" özelliği yoksa, bu en iyi çözüm değildir .
" .First () adında bir yöntem var " . Aynı sonucu elde etmek daha az abartılıdır. "Sonuç kümenizde" bir şey olup olmadığını kontrol edersiniz ve imlecinizi ilerletmezsiniz.
Dokümantasyonda: "(...) sonuç kümesinde hiç satır yoksa false" ifadesi bulunur .
if(rs.first()){
//do stuff
}
Ayrıca, imleci ilerletmeden döndürülen herhangi bir satır olup olmadığını test etmek için isBeforeFirst () yöntemini çağırabilirsiniz, ardından normal şekilde devam edin. - SnakeDoc 2 Eylül 14, 19:00
Ancak, "isBeforeFirst ()" ve "first ()" arasında bir fark vardır. İlk olarak "yalnızca ileri" türündeki bir sonuç kümesinde yapılırsa bir istisna oluşturur.
İki atış bölümünü karşılaştırın: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()
Tamam, temel olarak bu, "yalnızca ileri" türünüz olduğu sürece "isBeforeFirst" kullanmanız gerektiği anlamına gelir. Aksi takdirde "first ()" kullanmak daha az abartılı olur.
Sonuç kümesinde evet olup olmadığını görmek isterseniz bu işe yarar.
O Not next()
sonraki satıra hep hamle, bu nedenle sonucundan herhangi okuma yapıyor planlıyorsanız size bu hesaba katmalı gerekir ayarlayın.
ResultSet ile normal kullanım (sadece okurken):
while (resultSet.next())
{
... read from the row here ...
}
next()
Sonuç kümesinin boş olup olmadığını kontrol etmek için zaten bir kez çağırdıysanız, bu doğru bir şekilde çalışmaz , bu yüzden buna dikkat edin. "Yedekleme" yöntemleri olmasına rağmen, bunlar her tür sonuç kümesi için desteklenmez.
if (!resultSet.isAfterLast() ) {
System.out.println("No data");
}
isAfterLast()
boş sonuç kümesi için de false değerini döndürür, ancak imleç yine de ilk satırdan önce olduğu için bu yöntem daha net görünür.
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
Çünkü ResultSet öğesinde ham yoksa resultSet.first
false değerini döndürür.
Yapılacak en iyi şey, ilk satırı kontrol etmektir, böylece verileri almak istediğinizde bir satırı atlama hatasını önleyebilirsiniz. Şuna benzer: if (! SonuçSet.first ()) {System.out.println ("veri yok"); }
SonuçSet.next () kullanarak, herhangi bir değer içeren sonuç olsun ya da olmasın, sonucu kolayca elde edebilirsiniz.
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
status = "ERROR";
else
status = "SUCCESS";
Geçerli satır (birincil anahtarları ile ilgili) ilk dizine ayarlamaya çalışıyorum. öneririm
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
ResultSet doldurulduğunda, ilk satırdan önce işaret eder. İlk satıra (ile gösterilir rs.absolute(1)
) ayarlandığında , satır 1'e başarıyla yerleştirildiğini belirten doğru veya satır yoksa yanlış değerini döndürür. Bunu şu şekilde tahmin edebiliriz:
for(int i=1; rs.absolute(i); i++){
//Code
}
geçerli satırı i konumuna ayarlar ve satır yoksa başarısız olur. Bu sadece alternatif bir yöntem
while(rs.next()){
//Code
}
Bir ResultSet boş olup olmadığını kontrol etmek için aşağıdaki yöntemi oluşturdum.
public static boolean resultSetIsEmpty(ResultSet rs){
try {
// We point the last row
rs.last();
int rsRows=rs.getRow(); // get last row number
if (rsRows == 0) {
return true;
}
// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();
return false;
}catch(SQLException ex){
return true;
}
}
Aşağıdaki hususlara sahip olmak çok önemlidir:
CallableStatement nesnesi, ResultSet nesnesinin sonuna gitmesini ve en üste dönmesini sağlayacak şekilde ayarlanmalıdır.
TYPE_SCROLL_SENSITIVE : ResultSet nesnesi sonunda kayabilir ve en üste geri dönebilir. Ayrıca son değişiklikleri yakalayabilir.
CONCUR_READ_ONLY : ResultSet nesne verilerini okuyabiliriz, ancak güncellenemez.
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
Sonuç kümesini kontrol etmenin en kolay yolunun org.apache.commons.collections.CollectionUtils paketindeki CollectionUtils aracılığıyla olduğunu düşünüyorum
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
Bu, boş sonuç kümesi koşulunun yanı sıra boş değer olup olmadığını da kontrol eder.
Daha ayrıntılı bilgi için aşağıdaki dokümana başvurabilirsiniz. CollectionUtils
Neden rs.getRow () kullanmıyorsunuz?
int getRow()
throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2
Benim için "eğer (rs.getRow ()! = 0)" iyi çalışıyor gibi görünüyor.
böyle bir şey yapabilirsin
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
ResultSet rs = rs.executeQuery();
if(rs.next())
{
rs = rs.executeQuery();
while(rs.next())
{
//do code part
}
}
else
{
//else if no result set
}
Sorguyu yeniden çalıştırmak daha iyidir, çünkü if(rs.next()){....}
ResultSet'in ilk satırını çağırdığımızda ve içeriden sonra bir while(rs.next()){....}
sonraki satırdan sonuç alacağız. Bu yüzden sorguyu yeniden yürütmenin if
daha iyi bir seçenek olduğunu düşünüyorum .
Başlangıçta, sonuç kümesi nesnesi (rs) BFR'yi işaret eder (ilk kayıttan önce). Rs.next () yöntemini kullandığımızda, imleç ilk kaydı gösterir ve rs "true" değerini tutar. While döngüsünü kullanarak tablonun tüm kayıtlarını yazdırabilirsiniz. Tüm kayıtlar alındıktan sonra, imleç ALR'ye (Son kayıttan sonra) hareket eder ve null değerine ayarlanır. Tabloda 2 kayıt olduğunu düşünelim.
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
Kısaca, durumu şu şekilde de yazabiliriz (rs.next ()).