Herhangi bir sonuç olup olmadığını nasıl kontrol edeceğinizi ayarlayın


311

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");
} 

2
Benim gibi gelecek okuyucular için: bana yardımcı yanıtlar Felype ve Dermot Doherty gelen olanlardır
Benj

Yanıtlar:


237

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.


37
Ancak, / satırları varsa, bu testten sonra ilk satırı işaret edeceğinizi unutmayın. Bu yüzden yanlışlıkla bir satırı atlamadığınızdan emin olun.
Matthew Flaschen

1
İmlecin (işaretçi) ilk satıra işaret ettiği iyi bir nokta
JohnMerlino

@MatthewFlaschen, haklısın, ilk satırı atla sorununu çözmek için bir do {...} kullanırken (rs.next);
Israelm

8
Ayrıca 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.
SnakeDoc

528

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"); 
} 

 


15
Teşekkürler, evet biliyorum ama aynı sorunla karşılaştım ve kontrol etmek için ileriye doğru ilerlemek ve sonra okumak için geriye doğru bakmaktan memnun değildim. Bu daha basit çözümün aynı durumda olan diğerlerine de fayda sağlayacağını düşündüm.
Seifer

5
En azından DB2 için sonuç kümesinin "kaydırılabilir" bir tür olması gerektiğini unutmayın. Bu, çalıştırılacak ifadeyi oluşturduğunuzda ayarlanabilir.
Laurence Dougal Myers


Oracle Belgeleri'nden: Not: isBeforeFirst yöntemi için destek, sonuç kümesi türü TYPE_FORWARD_ONLY
emi-le

52

her zaman bir sonraki önü yapabilirsin ve sadece bir döngü döngüsü kontrolü yapabilirsin

if (!resultSet.next() ) {
    System.out.println("no data");
} else {

    do {
     //statement(s)
    } while (resultSet.next());
}

21

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.


16

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.


12

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());
}

8

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.


1
Tam olarak aynı sonucu elde etmek nasıl "daha az aşırı" olur? Bana öyle geliyor ki, ilk () amacı zaten orada değilse imleci ilk satıra taşımak (ve başarılı olursa true değerini döndürmek). isBeforeFirst yalnızca tanı amaçlı bir işlevdir ve yazarın amaçlarına daha uygun görünür. Ayrıca, first () ifadesi, "geçerli bir satırda" olduğu sürece true değerini döndürür. Bana göre, imleciniz ilerlemedikçe ve bunu başlangıca geri getirmek istemiyorsanız, bu senaryoda ilk () yöntemini kullanmanın avantajını görmüyorum.
Jon

5

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.


5

Bu pratik ve kolay okunan bir parça.

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }

2
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.


2
if(resultSet.first) {

} else { 
    system.out.println("No raw or resultSet is empty");
}

Çünkü ResultSet öğesinde ham yoksa resultSet.firstfalse değerini döndürür.


Ancak imleci gereksiz yere ilk satıra taşır ve ob "reset" nesnesinin daha fazla kullanılmasını karıştırabilir ve veri kaybedebilir
Tigran Babajanyan

Bu daha iyi görünse de, yalnızca ileri imleç sonuç kümesi üzerinde çalışmaz.
eliteproxy

1

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"); }


1

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

Mevcut cevapları tekrarlamayın.
james.garriss

1
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";

1

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
}

Cevabın nedir?
CMedina

1

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);

1

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


1
ResultSet bir Koleksiyon değildir.
Joachim Lous

1

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.


0

böyle bir şey yapabilirsin

boolean found = false;

while ( resultSet.next() )
{
    found = true;
    resultSet.getString("column_name");
}

if (!found)
    System.out.println("No Data");

1
WAAAY çok karmaşık.
jordaniac89

0
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 ifdaha iyi bir seçenek olduğunu düşünüyorum .


5
-1 Bu daha iyi bir seçenek değil. Veritabanını neden iki kez sorgulayalım? Aramalar arasında veriler büyük ölçüde değişirse ne olur? Bu israftır.
Toby Caulk

-2

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 ()).


3
While döngünüz, döndürülen ilk satırda çalışma şansı elde etmeyecektir, bu da bu yaklaşımla biraz ölümcül bir kusur gibi görünüyor. Yukarıda bundan daha iyi olan birçok öneri var.
Jules
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.