2009-05-15 6 views

उत्तर

186

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

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

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

+28

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

+1

अच्छा बिंदु कि कर्सर (पॉइंटर) पहली पंक्ति – JohnMerlino

+0

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

17

आप आम तौर पर कुछ इस तरह करना होगा:

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

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

5

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

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

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

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

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

40

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

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

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

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

जैसा कि प्रलेखन में बताया गया है, यह कर्सर गलत रिकॉर्ड करता है अगर कर्सर पहले रिकॉर्ड से पहले नहीं है या परिणामसेट में कोई पंक्ति नहीं है।

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

 

+14

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

+5

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

+0

[नीचे फेलपे का जवाब] (https://stackoverflow.com/a/15750832/269221) अधिक पूर्ण –

1
if(reset.first) { 

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

क्योंकि अगर ResultSet कोई कच्चे तो reset.first रिटर्न झूठी है।

+0

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

6

इसके साथ {{} जबकि() सिंटैक्स के साथ ResultSet.next() का उपयोग करने के लिए सबसे अच्छा है।

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

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

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()); 
} 
1
ResultSet result = stmt.executeQuery(sqlQuery); 
if (!result.next()) 
    status = "ERROR"; 
else 
    status = "SUCCESS"; 
5

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

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

इस समारोह सच वापस आ जाएगी अगर ResultSet रिक्त है , अगर झूठ नहीं है या एक SQLException फेंक अगर वह परिणाम बंद/अनियंत्रित है।

1

सबसे अच्छी बात यह है कि पहली पंक्ति जांचना है ताकि जब आप डेटा प्राप्त करना चाहते हैं तो आप एक पंक्ति छोड़ने की गलती से बच सकते हैं। कुछ ऐसा: अगर (! परिणामसेट। फर्स्ट()) {System.out.println ("कोई डेटा नहीं"); }

0

आप इस

boolean found = false; 

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

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

WAAAY बहुत जटिल है। – jordaniac89

-2
BFR को

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

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

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

संक्षेप में, हम इस समय भी लिख सकते हैं (rs.next())।

+2

आपके लूप लूप को पहली पंक्ति पर काम करने का मौका नहीं मिलेगा, जो इस दृष्टिकोण के साथ कुछ हद तक घातक दोष लगता है। उपरोक्त बहुत सारे सुझाव हैं जो इस से बेहतर हैं। – Jules

1

resultSet.next (का उपयोग करके) आप आसानी से ResultSet किसी भी मूल्य या नहीं

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

मौजूदा उत्तरों दोहराना मत करो। –

1
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 के अंदर क्वेरी का पुन: निष्पादन बेहतर विकल्प है।

+3

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

6

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

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

प्रलेखन कहता है: "(...) झूठी अगर परिणाम में कोई पंक्ति नहीं है।

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

आप, साथ ही isBeforeFirst कॉल कर सकते हैं() अगर कोई पंक्तियों कर्सर को आगे बढ़ाने के बिना लौट आए हैं परीक्षण करने के लिए है, तो सामान्य रूप से आगे बढ़ें। - SnakeDoc Sep 2 '14 at 19:00

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

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

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

+0

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

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

isAfterLast() भी खाली सेट परिणाम के लिए झूठे रिटर्न लेकिन जब से कर्सर पहली पंक्ति से पहले वैसे भी है, इस विधि को और अधिक स्पष्ट लगता है।

2

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

 if (res.next()) { 
      do { 

       // successfully in. do the right things. 

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

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

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

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

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

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

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

आपका उत्तर क्या है? – CMedina

1

पर एक वैकल्पिक तरीका है, मैंने यह देखने के लिए निम्न विधि बनाई है कि कोई परिणामसेट खाली है या नहीं।

CallableStatement वस्तु अंत में जाने के लिए और शीर्ष करने के लिए वापस जाने के ResultSet वस्तु के लिए जाने के लिए setted किया जाना चाहिए:

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

यह निम्नलिखित बातों के लिए बहुत महत्वपूर्ण है।

TYPE_SCROLL_SENSITIVE: परिणामसेट ऑब्जेक्ट अंत में स्थानांतरित हो सकता है और शीर्ष पर वापस जा सकता है। आगे अंतिम परिवर्तन पकड़ सकते हैं।

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

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

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

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

पैकेज के अंतर्गत CollectionUtils के माध्यम से है यह खाली है और साथ ही अशक्त के लिए जाँच करेगा परिणाम सेट की स्थिति।

अधिक जानकारी के लिए आप निम्नलिखित दस्तावेज़ को देख सकते हैं। CollectionUtils

0

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 

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

संबंधित मुद्दे