जावा परिणाम कैसे चेक करें अगर कोई परिणाम है


311

ResultsNet hasNext के लिए कोई विधि नहीं है। मैं यह जांचना चाहता हूं कि क्या परिणामसेट का कोई मूल्य है

क्या यह सही तरीका है

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

2
मेरे जैसे भविष्य पाठकों के लिए: जवाब है कि मुझे मदद की Felype और डर्मोट डोहर्टी से होते हैं
Benj

जवाबों:


237

यह सही है, शुरू में ResultSetकर्सर पहली पंक्ति से पहले की ओर इशारा करता है, अगर पहली कॉल next()रिटर्न की है falseतो उसमें कोई डेटा नहीं था ResultSet

यदि आप इस विधि का उपयोग करते हैं, तो आपको beforeFirst()इसे रीसेट करने के तुरंत बाद कॉल करना पड़ सकता है , क्योंकि इसने खुद को अब पहली पंक्ति में तैनात किया है।

हालांकि, यह ध्यान दिया जाना चाहिए कि नीचे Seifer का उत्तर इस प्रश्न का अधिक सुरुचिपूर्ण समाधान है।


37
लेकिन ध्यान रखें, अगर वहाँ / पंक्तियाँ हैं, तो उस परीक्षा के बाद आप पहली पंक्ति की ओर इशारा करेंगे। तो सुनिश्चित करें कि आप गलती से एक पंक्ति छोड़ नहीं है।
मैथ्यू फ्लैशेन

1
अच्छी बात यह है कि कर्सर (पॉइंटर) पहली पंक्ति में इंगित कर रहा है
जॉनमेरलिनो

@MatthewFlaschen, आप सही हैं, पहली पंक्ति को छोड़ने के मुद्दे को हल करने के लिए, मैंने (rs.next) करते समय {...} का उपयोग किया;
इज़राइल

8
आप केवल isBeforeFirst()परीक्षण करने के लिए भी कॉल कर सकते हैं यदि कर्सर को आगे बढ़ाए बिना कोई पंक्तियाँ वापस आती हैं, तो सामान्य रूप से आगे बढ़ें।
स्नेकडोक

528

मान लें कि आप एक नए लौटे के साथ काम कर रहे हैं ResultSetजिसका कर्सर पहली पंक्ति से पहले इशारा कर रहा है, यह जांचने का एक आसान तरीका सिर्फ कॉल करना है isBeforeFirst()। यदि डेटा को पढ़ना है तो यह बैक-ट्रैक होने से बचता है।

जैसा कि दस्तावेज़ीकरण में बताया गया है , यह गलत है यदि कर्सर पहले रिकॉर्ड से पहले नहीं है या अगर परिणाम में कोई पंक्तियाँ नहीं हैं

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
} 

 


15
धन्यवाद, हाँ, मुझे पता है लेकिन मैं एक ही समस्या का सामना कर रहा था और आगे पढ़ने के लिए आगे बढ़ने के लिए आगे बढ़ने की नज़र से खुश नहीं था। मैंने सोचा कि इस सरल समाधान से उन लोगों को भी लाभ होगा जो समान स्थिति में हैं।
सीफोर

5
ध्यान दें कि, कम से कम DB2 के लिए, परिणाम सेट को "स्क्रॉल करने योग्य" प्रकार होना चाहिए। यह तब सेट किया जा सकता है जब आप निष्पादित किए जाने वाले विवरण बनाते हैं।
लॉरेंस डगल मायर्स


ओरेकल डॉक्यूमेंटेशन से: नोट: isBeforeFirst विधि का समर्थन परिणाम के प्रकार के लिए वैकल्पिक है, जिसके परिणामस्वरूप TYPE_FORWARD_ONLY
emi-le

52

आप हमेशा अगला फ्रंट कर सकते हैं, और बस एक पोस्ट लूप चेक कर सकते हैं

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

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

21

आप आमतौर पर ऐसा कुछ करेंगे:

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}

यदि आप एक खाली सेट की रिपोर्ट करना चाहते हैं, तो पढ़े गए आइटमों की गिनती करने वाला एक चर जोड़ें। यदि आपको केवल एक आइटम पढ़ने की आवश्यकता है, तो आपका कोड पर्याप्त है।


16

इसके बजाय पूरी तरह से सुनिश्चित होना कि परिणामी स्थिति खाली है या कर्सर स्थिति की परवाह किए बिना, मैं कुछ इस तरह से करूंगा:

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
    return (!rs.isBeforeFirst() && rs.getRow() == 0);
}

यदि ResultSet खाली है, तो यह फ़ंक्शन सही वापस आ जाएगा और यदि Sultlexception बंद है या नहीं तो SQLException को फेंक दें।


12

ResultSet.next () के साथ {{}} करते हुए (इसके लिए सिंटैक्स) का उपयोग करने के लिए सर्वश्रेष्ठ।

"किसी भी परिणाम की जांच करें" कॉल ResultSet.next () कर्सर को पहली पंक्ति में ले जाती है, इसलिए लूप द्वारा लौटी शेष पंक्तियों को संसाधित करने के लिए उस पंक्ति को संसाधित करते समय उस पंक्ति को संसाधित करने के लिए {...} जबकि () सिंटैक्स का उपयोग करें।

इस तरह से आप किसी भी परिणाम के लिए जांच कर सकते हैं, जबकि उसी समय किसी भी परिणाम को संसाधित भी कर सकते हैं।

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

सबसे व्यवहार्य उत्तर के अनुसार सुझाव "isBeforeFirst ()" का उपयोग करना है। यदि आपके पास "आगे केवल प्रकार" नहीं है, तो यह सबसे अच्छा समाधान नहीं है

" .First () " नामक एक विधि है । सटीक परिणाम प्राप्त करने के लिए यह कम ओवरकिल है। आप जांचते हैं कि आपके "परिणाम" में कुछ है या नहीं और अपने कर्सर को आगे न बढ़ाएं।

प्रलेखन में कहा गया है: "(...) गलत है अगर परिणाम सेट में कोई पंक्तियाँ नहीं हैं "।

if(rs.first()){
    //do stuff      
}

आप परीक्षण करने के लिए बस भी कॉल कर सकते हैं। यदि आपके पास कर्सर को आगे बढ़ाए बिना कोई पंक्तियाँ हैं, तो परीक्षण करने के लिए सामान्य रूप से आगे बढ़ें। - स्नेकडोक सिपाही 2 '14 19:00 बजे

हालाँकि, "BeforeFirst () "और" प्रथम () "के बीच अंतर है। पहले एक अपवाद उत्पन्न करता है यदि "केवल आगे" प्रकार से एक परिणाम पर किया जाता है।

दो फेंक अनुभागों की तुलना करें: 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 ()

ठीक है, मूल रूप से इसका मतलब है कि जब तक आपके पास "आगे केवल" प्रकार है, तब तक आपको "BeforeFirst "का उपयोग करना चाहिए। अन्यथा यह "पहले ()" का उपयोग करने के लिए कम ओवरकिल है।


1
सटीक परिणाम प्राप्त करने के लिए यह "कम ओवरकिल" कैसे है? यह मुझे पहले का उद्देश्य लगता है () कर्सर को पहली पंक्ति में ले जाना है अगर यह पहले से ही वहां नहीं है (और अगर यह सफल हुआ तो वापस लौटें)। isBeforeFirst केवल विशुद्ध रूप से नैदानिक ​​कार्य है और लेखक के उद्देश्यों के लिए अधिक अनुकूल लगता है। इसके अलावा, जिस तरह से पहले () शब्द है, यह तब तक सच है जब तक कि यह "एक वैध पंक्ति पर" है ... जो कि अजीब है क्योंकि किसी को लगता है कि इसे "पहली पंक्ति में" कहा जाएगा। मेरे लिए, मैं इस परिदृश्य में पहले () का उपयोग करने का लाभ नहीं देखता जब तक कि आपका कर्सर उन्नत न हो और आप इसे शुरुआत में वापस लाना चाहते हों।
जॉन

5

यदि आप यह देखना चाहते हैं कि क्या परिणाम सेट में कोई पंक्तियाँ हैं, तो यह काम करेगा।

ध्यान दें कि next()हमेशा अगली पंक्ति में चला जाता है, इसलिए यदि आप परिणाम सेट से कोई रीडिंग करने की योजना बना रहे हैं तो आपको इसे ध्यान में रखना होगा।

परिणाम के साथ सामान्य उपयोग (जब बस पढ़ने) है:

while (resultSet.next())
{
   ... read from the row here ...
}

next()यदि परिणाम सेट खाली था, तो यह स्पष्ट रूप से सही ढंग से काम नहीं करेगा कि आपने पहले ही एक बार चेक किया था, इसलिए उसके लिए बाहर देखें। यद्यपि "बैक अप" के लिए विधियाँ हैं, फिर भी वे सभी प्रकार के परिणाम सेटों के लिए समर्थित नहीं हैं।


5

यह मेरा मानना ​​है कि एक व्यावहारिक और आसान पढ़ा हुआ टुकड़ा है।

        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() खाली रिजल्ट सेट के लिए भी गलत है, लेकिन चूँकि कर्सर पहली पंक्ति के वैसे भी है, इसलिए यह विधि अधिक स्पष्ट है।


2
if(resultSet.first) {

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

क्योंकि अगर ResultSet में कोई कच्चा नहीं है तो resultSet.firstवह गलत है।


लेकिन यह कर्सर को पहली पंक्ति में अनावश्यक स्थानांतरित करता है, और यह "रीसेट" ऑब्जेक्ट के आगे उपयोग को भ्रमित कर सकता है और डेटा खो सकता है
तिगरान बाबजन्यन

हालांकि यह बेहतर दिखता है, यह केवल कर्सर परिणाम के फॉरवर्ड पर काम नहीं करेगा।
कुलीन वर्ग

1

सबसे अच्छी बात यह है कि पहली पंक्ति की जांच करें ताकि जब आप डेटा प्राप्त करने का इरादा रखते हैं तो आप पंक्ति को छोड़ने की गलती से बच सकें। कुछ इस तरह: अगर ((resultSet.first ()) {System.out.println ("कोई डेटा नहीं"); }


1

ResultSet.next () का उपयोग करके आप आसानी से परिणाम प्राप्त कर सकते हैं, चाहे resultSet जिसमें कोई मान हो या न हो

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet

मौजूदा उत्तरों को न दोहराएं।
james.garriss


1

मैं वर्तमान पंक्ति को पहली अनुक्रमणिका (प्राथमिक कुंजियों से निपटने) में सेट करने का प्रयास कर रहा हूं। मै सुझाव दूंगा

if(rs.absolute(1)){
    System.out.println("We have data");
} else {
    System.out.println("No data");
}

जब ResultSet पॉपुलेटेड होता है, तो यह पहली पंक्ति से पहले इंगित करता है। जब इसे पहली पंक्ति में स्थापित किया जाता है ( rs.absolute(1)इसके द्वारा इंगित किया जाता है ) तो यह सही अर्थ दर्शाएगा कि यह पंक्ति 1 में सफलतापूर्वक रखा गया था या यदि पंक्ति मौजूद नहीं है तो गलत है। हम इसे अतिरिक्त रूप से लागू कर सकते हैं

for(int i=1; rs.absolute(i); i++){
    //Code
}

जो वर्तमान पंक्ति को i की स्थिति में सेट करता है और यदि पंक्ति मौजूद नहीं है तो विफल हो जाएगी। यह सिर्फ एक वैकल्पिक तरीका है

while(rs.next()){
    //Code
}

आपका जवाब क्या है?
सीएमडिना

1

मैंने जांचने के लिए निम्न विधि बनाई कि क्या कोई रिजल्टसेट खाली है।

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

निम्नलिखित विचार रखना बहुत महत्वपूर्ण है:

CallableStatement ऑब्जेक्ट को ResultSet ऑब्जेक्ट को अंत में जाने और वापस शीर्ष पर जाने के लिए व्यवस्थित किया जाना चाहिए।

TYPE_SCROLL_SENSITIVE : परिणाम ऑब्जेक्ट अंत में शिफ्ट हो सकता है और शीर्ष पर वापस जा सकता है। इसके अलावा पिछले बदलाव को पकड़ सकता है।

CONCUR_READ_ONLY : हम ResultSet ऑब्जेक्ट डेटा पढ़ सकते हैं, लेकिन अपडेट नहीं किया जा सकता है।

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

1

मुझे लगता है कि परिणाम सेट की जाँच के लिए सबसे आसान तरीका पैकेज के तहत CollectionUtils के माध्यम से है। org.apache.commons.collections.CollectionUtils

if(CollectionUtils.isNotEmpty(resultList)){
  /**
  * do some stuff
  */
}

यह अशक्त के साथ-साथ खाली परिणाम सेट की स्थिति की जांच करेगा।

अधिक विस्तार से जानकारी के लिए आप निम्नलिखित डॉक्टर का उल्लेख कर सकते हैं। CollectionUtils


1
ResultSet एक संग्रह नहीं है।
जोआचिम लूज

1

क्यों नहीं rs.getRow () का उपयोग करें?

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

मेरे लिए "अगर (rs.getRow ()! = 0)" ठीक ठीक काम करने लगता है।



0
ResultSet rs = rs.executeQuery();
if(rs.next())
{
  rs = rs.executeQuery();
  while(rs.next())
  {
    //do code part
  }
}
else
{
  //else if no result set
}

क्वेरी को फिर से निष्पादित करना बेहतर है क्योंकि जब हम if(rs.next()){....}पहली पंक्ति को while(rs.next()){....}परिणाम कहते हैं तो इसे निष्पादित किया जाएगा और इसके अंदर आने के बाद हमें अगली पंक्ति का परिणाम मिलेगा। इसलिए मुझे लगता है कि अंदर क्वेरी का पुन: निष्पादन ifबेहतर विकल्प है।


5
-1 यह एक बेहतर विकल्प नहीं है। दो बार डेटाबेस की क्वेरी क्यों? क्या होगा अगर डेटा कॉल के बीच काफी बदल जाता है? यह फिजूलखर्ची है।
टोबी कॉल्क

-2

प्रारंभ में, परिणाम सेट ऑब्जेक्ट (आरएस) बीएफआर (पहले रिकॉर्ड से पहले) को इंगित करता है। एक बार जब हम rsnext () का उपयोग करते हैं, तो कर्सर पहले रिकॉर्ड की ओर इशारा करता है और rs "सही" रखता है। लूप का उपयोग करते हुए आप तालिका के सभी रिकॉर्ड प्रिंट कर सकते हैं। सभी रिकॉर्डों को पुनर्प्राप्त करने के बाद, कर्सर ALR (अंतिम रिकॉर्ड के बाद) में चला जाता है और इसे शून्य पर सेट किया जाएगा। आइए विचार करें कि तालिका में 2 रिकॉर्ड हैं।

if(rs.next()==false){
    // there are no records found
    }    

while (rs.next()==true){
    // print all the records of the table
    }

छोटे हाथ में, हम इस स्थिति को भी लिख सकते हैं जबकि (rs.next ())।


3
आपके जबकि लूप को लौटी पहली पंक्ति पर काम करने का मौका नहीं मिलेगा, जो इस दृष्टिकोण के साथ कुछ घातक दोष लगता है। ऊपर बहुत सारे सुझाव हैं जो इस से बेहतर हैं।
जूल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.