জাভা রেজাল্টসেট কীভাবে কোনও ফলাফল আছে কিনা তা পরীক্ষা করে দেখুন


311

রেজাল্টসেটের হ্যাশেক্সট এর কোনও পদ্ধতি নেই। রেজাল্টসেটের কোনও মূল্য আছে কিনা তা আমি পরীক্ষা করতে চাই

এটাই কি সঠিক উপায়?

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

2
আমার মতো ভবিষ্যতের পাঠকদের জন্য: যে উত্তরগুলি আমাকে সাহায্য করেছিল সেগুলি হ'ল ফেলিপ এবং ডার্মোট দোহার্টি
বেঞ্জ

উত্তর:


237

এটি সঠিক, প্রথমদিকে প্রথম ResultSetকার্সারটি প্রথম সারির আগে ইশারা করছে, যদি প্রথম কলটি next()ফিরে আসে falseতবে এর মধ্যে কোনও ডেটা ছিল না ResultSet

আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে আপনাকে কল করতে হতে পারে beforeFirst() পুনরায় সেট করার জন্য আপনাকে অবিলম্বে করতে হবে, যেহেতু এটি এখন প্রথম সারির অতীতে অবস্থান করেছে।

তবে এটি লক্ষ করা উচিত, নীচে সিফারের উত্তরটি এই প্রশ্নের আরও মার্জিত সমাধান।


37
তবে মনে রাখবেন, যদি সেখানে / থাকে / সারি থাকে তবে সেই পরীক্ষার পরে আপনি প্রথম সারিতে দেখিয়ে যাবেন। সুতরাং নিশ্চিত হয়ে নিন যে আপনি ঘটনাক্রমে কোনও সারি এড়িয়ে যাচ্ছেন না।
ম্যাথু ফ্ল্যাশেন

1
ভাল পয়েন্ট যে কার্সার (পয়েন্টার) প্রথম সারিতে নির্দেশ করছে
জনমারলিনো

@ ম্যাথিউ ফ্ল্যাশেন, আপনি ঠিক বলেছেন, প্রথম সারিতে এড়ানোর সমস্যাটি সমাধান করার জন্য, আমি একটি কর {...} ব্যবহার করেছি (আরএসএনেক্সট) যখন;
ইস্রায়েল

8
আপনি কেবল isBeforeFirst()পরীক্ষার জন্য কল করতে পারেন যদি কার্সারকে অগ্রসর না করে কোনও সারি ফিরে আসে তবে সাধারণভাবে এগিয়ে যান।
স্নেকডোক

528

ধরে নিই আপনি সদ্য ফিরে আসা ResultSetযার সাথে কার্সার প্রথম সারিটির আগে পয়েন্ট করছে তার সাথে কাজ করছেন , এটি পরীক্ষা করার একটি সহজ উপায় কেবল কল করা isBeforeFirst()। এটি যদি ডেটা পড়তে হয় তবে ব্যাক-ট্র্যাক হওয়া এড়ানো যায়।

ডকুমেন্টেশনে বর্ণিত হিসাবে , কার্সারটি প্রথম রেকর্ডের আগে না থাকলে বা রেজাল্টসেটে কোনও সারি না থাকলে এটি মিথ্যা প্রত্যাবর্তন করে

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

 


15
ধন্যবাদ, হ্যাঁ আমি জানি তবে আমি একই সমস্যার মুখোমুখি হয়েছি এবং পড়ার পিছনে পিছনে চেক করতে এগিয়ে যাওয়ার চেহারাতে সন্তুষ্ট নই। আমি ভেবেছিলাম যে এই সহজ সমাধানটি একই পরিস্থিতিতে থাকা অন্যদেরও উপকৃত হবে।
সিফার

5
নোট করুন, কমপক্ষে DB2 এর জন্য, ফলাফল সেটটি "স্ক্রোলযোগ্য" টাইপ হতে হবে। আপনি নির্ধারিত হওয়ার জন্য বিবৃতি তৈরি করার সময় এটি সেট করা যেতে পারে।
লরেন্স ডগল মায়ার্স


ওরাকল ডকুমেন্টেশন থেকে: দ্রষ্টব্য: ফলাফলের প্রথম ধরণের TYPE_FORWARDटकाLY
ইমি-লে

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

যদি রেজাল্টসেটটি খালি থাকে, মিথ্যা না হয় বা রেজাল্টসেটটি বন্ধ / অবিশ্রুত হয় যদি একটি এসকিএলএক্সসেপশন নিক্ষেপ করে তবে এই ফাংশনটি সত্য হবে।


12

এর জন্য (synt ...} সিনট্যাক্স সহ রেজাল্টসেট.নেক্সট () ব্যবহার করার জন্য সেরা।

"কোনও ফলাফলের জন্য চেক করুন" কল রেজাল্টসেট.নেক্সট () কর্সারটিকে প্রথম সারিতে নিয়ে যায়, সুতরাং লুপ দ্বারা ফিরে আসা সারিগুলিতে প্রক্রিয়া চালিয়ে যাওয়ার সময় এই সারিটি প্রক্রিয়া করার জন্য () সিনট্যাক্স ব্যবহার করুন।

এই সময়ে আপনি যে কোনও ফলাফলের জন্য যাচাই করতে পারেন, একই সাথে কোনও ফলাফলের প্রক্রিয়াকরণও হয়েছিল।

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

সবচেয়ে কার্যকর উত্তর অনুসারে পরামর্শটি হ'ল "isBeforeFrst ()" ব্যবহার করা। যদি আপনার কাছে "কেবলমাত্র ফরওয়ার্ড টাইপ" না থাকে তবে এটি সর্বোত্তম সমাধান নয়

" .প্রথম () নামে একটি পদ্ধতি আছে " । ঠিক একই ফলাফল পেতে এটি ওভারকিল কম। আপনার "রেজাল্টসেট" তে কিছু আছে কিনা তা আপনি পরীক্ষা করে দেখুন এবং আপনার কার্সরটি অগ্রসর করবেন না।

ডকুমেন্টেশনতে বলা হয়েছে: "(...) ফলাফল সেটটিতে কোনও সারি না থাকলে মিথ্যা "।

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

আপনি কার্সারকে অগ্রসর না করে যদি কোনও সারি ফিরে আসে কিনা তা পরীক্ষা করতে কেবল ইসফেন ফার্স্ট () কেও কল করতে পারেন, তবে স্বাভাবিকভাবে এগিয়ে যান। - স্নেকডোক ২ সেপ্টেম্বর '14 এ 19:00 এ

যাইহোক, "ইসফেনফার্সফার্স্ট ()" এবং "প্রথম ()" এর মধ্যে পার্থক্য রয়েছে। "কেবলমাত্র ফরওয়ার্ড" টাইপ থেকে রেজাল্টে করা হলে প্রথমে একটি ব্যতিক্রম উত্পন্ন করে।

দুটি নিক্ষেপ বিভাগের সাথে তুলনা করুন: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#is আগস্টে ফার্স্ট () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()

ঠিক আছে, মূলত এর অর্থ হ'ল যতক্ষণ না আপনার "ফরোয়ার্ড কেবল" টাইপ থাকে ততক্ষণ "আইজফারফর্স্ট" ব্যবহার করা উচিত। অন্যথায় এটি "প্রথম ()" ব্যবহার করার জন্য ওভারকিল কম less


1
সঠিক ফলাফলটি পেতে কীভাবে এটি "কম ওভারকিল" হয়? আমার কাছে মনে হয় প্রথম () এর উদ্দেশ্য হ'ল কার্সারটি ইতিমধ্যে সেখানে না থাকলে প্রথম সারিতে নিয়ে যাওয়া (এবং এটি সফল হলে সত্য ফিরে আসা)। ইসফারফারফার্স একটি খাঁটি ডায়াগোনস্টিক ফাংশন এবং এটি লেখকের উদ্দেশ্যগুলির পক্ষে আরও উপযুক্ত বলে মনে হয়। এছাড়াও, প্রথম () শব্দটি যেভাবে বলা হয়, ততক্ষণ এটি সত্য হয়ে যায় যতক্ষণ না এটি "বৈধ সারিতে থাকবে" ... এটি একেবারেই অদ্ভুত বলে মনে হয় যে এটি "প্রথম সারিতে" হিসাবে যুক্ত হবে। আমার কাছে, আমি এই দৃশ্যে প্রথম () ব্যবহার করার সুবিধা দেখতে পাচ্ছি না যদি না আপনার কার্সর অগ্রসর হয় এবং আপনি এটিকে প্রথম দিকে ফিরিয়ে আনতে চান না।
জন

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.firstমিথ্যা ফিরিয়ে দেয়।


তবে এটি কার্সারটিকে অপ্রয়োজনীয় প্রথম সারিতে নিয়ে যায় এবং এটি "পুনরায় সেট" অবজেক্টের আরও ব্যবহারকে বিভ্রান্ত করতে পারে এবং ডেটা
হারাতে

যদিও এটি আরও ভাল দেখায়, এটি কেবলমাত্র কার্সার ফলাফলসামগ্রী নিয়ে কাজ করবে না।
এলিটিপ্রোক্সি

1

করণীয় হ'ল সর্বোত্তম বিষয় হ'ল প্রথম সারিটি পরীক্ষা করা যাতে আপনি যখন তথ্য পাওয়ার ইচ্ছা করেন তখন আপনি কোনও সারি বাদ দেওয়ার ভুল এড়াতে পারেন। এর মতো কিছু: যদি (! ফলাফলসেট.ফর্স্ট ())। System.out.println ("কোনও ডেটা নেই"); }


1

রেজাল্টসেট.নেক্সট () ব্যবহার করে আপনি সহজেই ফলাফলটি পেতে পারেন, ফলাফলসেটের কোনও মান রয়েছে কিনা তা

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

যখন রেজাল্টসিটটি জনবহুল হয়, এটি প্রথম সারির আগে নির্দেশ করে। এটি প্রথম সারিতে স্থাপন করার সময় ( 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 অবজেক্টটি রেজাল্টসেট অবজেক্টটি শেষে যেতে এবং উপরে ফিরে যেতে সেট করতে হবে।

TYPE_SCROLL_SENSITIVE : রেজাল্টসেট অবজেক্টটি শেষে শিফট করে শীর্ষে ফিরে যেতে পারে। আরও শেষ পরিবর্তনগুলি ধরতে পারে।

CONCUR_READ_ONLY : আমরা রেজাল্টসেট অবজেক্ট ডেটা পড়তে পারি, তবে আপডেট করতে পারি না।

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

1

আমি মনে করি ফলাফল সেটটি যাচাইয়ের সহজতম উপায় হ'ল প্যাকেজ org.apache.commons.collections- এর আওতায় কালেকশন ইউটিলের মাধ্যমে lection

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

এটি নাল পাশাপাশি খালি ফলাফল সেট শর্ত পরীক্ষা করবে।

আরও বিশদ তথ্যের জন্য আপনি নিম্নলিখিত ডকটি দেখুন। CollectionUtils


1
রেজাল্টসেট কোনও সংগ্রহ নয়।
জোছিম লস

1

আরএস.জেটরো () ব্যবহার করবেন না কেন?

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)" পরীক্ষা করে ঠিক মনে হচ্ছে ঠিক আছে।



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 এটি এর চেয়ে ভাল বিকল্প নয়। কেন দুবার ডাটাবেস জিজ্ঞাসা? কলগুলির মধ্যে ডেটা যদি মারাত্মকভাবে পরিবর্তিত হয় তবে কী হবে? এটি অপব্যয়।
টবি Caulk

-2

প্রাথমিকভাবে, ফলাফল সেট অবজেক্ট (আরএস) বিএফআরকে নির্দেশ করে (প্রথম রেকর্ডের আগে)। একবার আমরা rs.next () ব্যবহার করি, কার্সারটি প্রথম রেকর্ডের দিকে নির্দেশ করে এবং আরএস "সত্য" ধারণ করে। ওয়েল লুপটি ব্যবহার করে আপনি টেবিলের সমস্ত রেকর্ড মুদ্রণ করতে পারেন। সমস্ত রেকর্ড পুনরুদ্ধার করার পরে, কার্সারটি ALR এ চলে যায় (শেষ রেকর্ডের পরে) এবং এটি বাতিল হয়ে যাবে। আসুন বিবেচনা করা যাক সারণিতে 2 টি রেকর্ড রয়েছে।

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

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

সংক্ষিপ্ত হাতে, আমরা যখন শর্তটি লিখতে পারি তখন (আরএস.এনেক্সট ())।


3
আপনার সময় লুপ ফিরে আসা প্রথম সারিতে কাজ করার সুযোগ পাবে না, যা এই পদ্ধতির সাথে কিছুটা মারাত্মক ত্রুটি বলে মনে হচ্ছে। উপরোক্ত প্রচুর পরামর্শ রয়েছে যা এইগুলির চেয়ে ভাল।
জুলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.