ResultsNet hasNext के लिए कोई विधि नहीं है। मैं यह जांचना चाहता हूं कि क्या परिणामसेट का कोई मूल्य है
क्या यह सही तरीका है
if (!resultSet.next() ) {
System.out.println("no data");
}
ResultsNet hasNext के लिए कोई विधि नहीं है। मैं यह जांचना चाहता हूं कि क्या परिणामसेट का कोई मूल्य है
क्या यह सही तरीका है
if (!resultSet.next() ) {
System.out.println("no data");
}
जवाबों:
यह सही है, शुरू में ResultSet
कर्सर पहली पंक्ति से पहले की ओर इशारा करता है, अगर पहली कॉल next()
रिटर्न की है false
तो उसमें कोई डेटा नहीं था ResultSet
।
यदि आप इस विधि का उपयोग करते हैं, तो आपको beforeFirst()
इसे रीसेट करने के तुरंत बाद कॉल करना पड़ सकता है , क्योंकि इसने खुद को अब पहली पंक्ति में तैनात किया है।
हालांकि, यह ध्यान दिया जाना चाहिए कि नीचे Seifer का उत्तर इस प्रश्न का अधिक सुरुचिपूर्ण समाधान है।
isBeforeFirst()
परीक्षण करने के लिए भी कॉल कर सकते हैं यदि कर्सर को आगे बढ़ाए बिना कोई पंक्तियाँ वापस आती हैं, तो सामान्य रूप से आगे बढ़ें।
मान लें कि आप एक नए लौटे के साथ काम कर रहे हैं ResultSet
जिसका कर्सर पहली पंक्ति से पहले इशारा कर रहा है, यह जांचने का एक आसान तरीका सिर्फ कॉल करना है isBeforeFirst()
। यदि डेटा को पढ़ना है तो यह बैक-ट्रैक होने से बचता है।
जैसा कि दस्तावेज़ीकरण में बताया गया है , यह गलत है यदि कर्सर पहले रिकॉर्ड से पहले नहीं है या अगर परिणाम में कोई पंक्तियाँ नहीं हैं ।
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
आप आमतौर पर ऐसा कुछ करेंगे:
while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}
यदि आप एक खाली सेट की रिपोर्ट करना चाहते हैं, तो पढ़े गए आइटमों की गिनती करने वाला एक चर जोड़ें। यदि आपको केवल एक आइटम पढ़ने की आवश्यकता है, तो आपका कोड पर्याप्त है।
इसके बजाय पूरी तरह से सुनिश्चित होना कि परिणामी स्थिति खाली है या कर्सर स्थिति की परवाह किए बिना, मैं कुछ इस तरह से करूंगा:
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}
यदि ResultSet खाली है, तो यह फ़ंक्शन सही वापस आ जाएगा और यदि Sultlexception बंद है या नहीं तो SQLException को फेंक दें।
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());
}
सबसे व्यवहार्य उत्तर के अनुसार सुझाव "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 "का उपयोग करना चाहिए। अन्यथा यह "पहले ()" का उपयोग करने के लिए कम ओवरकिल है।
यदि आप यह देखना चाहते हैं कि क्या परिणाम सेट में कोई पंक्तियाँ हैं, तो यह काम करेगा।
ध्यान दें कि next()
हमेशा अगली पंक्ति में चला जाता है, इसलिए यदि आप परिणाम सेट से कोई रीडिंग करने की योजना बना रहे हैं तो आपको इसे ध्यान में रखना होगा।
परिणाम के साथ सामान्य उपयोग (जब बस पढ़ने) है:
while (resultSet.next())
{
... read from the row here ...
}
next()
यदि परिणाम सेट खाली था, तो यह स्पष्ट रूप से सही ढंग से काम नहीं करेगा कि आपने पहले ही एक बार चेक किया था, इसलिए उसके लिए बाहर देखें। यद्यपि "बैक अप" के लिए विधियाँ हैं, फिर भी वे सभी प्रकार के परिणाम सेटों के लिए समर्थित नहीं हैं।
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
क्योंकि अगर ResultSet में कोई कच्चा नहीं है तो resultSet.first
वह गलत है।
सबसे अच्छी बात यह है कि पहली पंक्ति की जांच करें ताकि जब आप डेटा प्राप्त करने का इरादा रखते हैं तो आप पंक्ति को छोड़ने की गलती से बच सकें। कुछ इस तरह: अगर ((resultSet.first ()) {System.out.println ("कोई डेटा नहीं"); }
ResultSet.next () का उपयोग करके आप आसानी से परिणाम प्राप्त कर सकते हैं, चाहे resultSet जिसमें कोई मान हो या न हो
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";
मैं वर्तमान पंक्ति को पहली अनुक्रमणिका (प्राथमिक कुंजियों से निपटने) में सेट करने का प्रयास कर रहा हूं। मै सुझाव दूंगा
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
}
मैंने जांचने के लिए निम्न विधि बनाई कि क्या कोई रिजल्टसेट खाली है।
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);
मुझे लगता है कि परिणाम सेट की जाँच के लिए सबसे आसान तरीका पैकेज के तहत CollectionUtils के माध्यम से है। org.apache.commons.collections.CollectionUtils
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
यह अशक्त के साथ-साथ खाली परिणाम सेट की स्थिति की जांच करेगा।
अधिक विस्तार से जानकारी के लिए आप निम्नलिखित डॉक्टर का उल्लेख कर सकते हैं। CollectionUtils
क्यों नहीं 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)" ठीक ठीक काम करने लगता है।
आप ऐसा कुछ कर सकते हैं
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
}
क्वेरी को फिर से निष्पादित करना बेहतर है क्योंकि जब हम if(rs.next()){....}
पहली पंक्ति को while(rs.next()){....}
परिणाम कहते हैं तो इसे निष्पादित किया जाएगा और इसके अंदर आने के बाद हमें अगली पंक्ति का परिणाम मिलेगा। इसलिए मुझे लगता है कि अंदर क्वेरी का पुन: निष्पादन if
बेहतर विकल्प है।
प्रारंभ में, परिणाम सेट ऑब्जेक्ट (आरएस) बीएफआर (पहले रिकॉर्ड से पहले) को इंगित करता है। एक बार जब हम 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 ())।