রেজাল্টসেটের হ্যাশেক্সট এর কোনও পদ্ধতি নেই। রেজাল্টসেটের কোনও মূল্য আছে কিনা তা আমি পরীক্ষা করতে চাই
এটাই কি সঠিক উপায়?
if (!resultSet.next() ) {
System.out.println("no data");
}
রেজাল্টসেটের হ্যাশেক্সট এর কোনও পদ্ধতি নেই। রেজাল্টসেটের কোনও মূল্য আছে কিনা তা আমি পরীক্ষা করতে চাই
এটাই কি সঠিক উপায়?
if (!resultSet.next() ) {
System.out.println("no data");
}
উত্তর:
এটি সঠিক, প্রথমদিকে প্রথম ResultSet
কার্সারটি প্রথম সারির আগে ইশারা করছে, যদি প্রথম কলটি next()
ফিরে আসে false
তবে এর মধ্যে কোনও ডেটা ছিল না ResultSet
।
আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে আপনাকে কল করতে হতে পারে beforeFirst()
পুনরায় সেট করার জন্য আপনাকে অবিলম্বে করতে হবে, যেহেতু এটি এখন প্রথম সারির অতীতে অবস্থান করেছে।
তবে এটি লক্ষ করা উচিত, নীচে সিফারের উত্তরটি এই প্রশ্নের আরও মার্জিত সমাধান।
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);
}
যদি রেজাল্টসেটটি খালি থাকে, মিথ্যা না হয় বা রেজাল্টসেটটি বন্ধ / অবিশ্রুত হয় যদি একটি এসকিএলএক্সসেপশন নিক্ষেপ করে তবে এই ফাংশনটি সত্য হবে।
এর জন্য (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());
}
সবচেয়ে কার্যকর উত্তর অনুসারে পরামর্শটি হ'ল "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
হ্যাঁ রেজাল্টে কোনও সারি আছে কিনা তা আপনি দেখতে চাইলে এটি কাজ করবে।
নোট করুন যে next()
সর্বদা পরের সারিতে চলে যায়, তাই আপনি যদি ফলাফল সেট থেকে কোনও পড়া করার পরিকল্পনা করে থাকেন তবে আপনাকে এটিকে অ্যাকাউন্টে নেওয়া উচিত।
রেজাল্টসেটের সাথে সাধারণ ব্যবহার (যখন সহজভাবে পড়া হয়):
while (resultSet.next())
{
... read from the row here ...
}
next()
ফলাফলটি খালি কিনা তা পরীক্ষা করার জন্য আপনি যদি ইতিমধ্যে একবার অনুরোধ করেছিলেন তবে স্পষ্টতই এটি সঠিকভাবে কাজ করবে না , তাই এটির জন্য নজর রাখুন। যদিও "ব্যাক আপ" র জন্য বিভিন্ন পদ্ধতি রয়েছে তবে এগুলি সকল ধরণের ফলাফলের জন্য সমর্থিত নয়।
if (!resultSet.isAfterLast() ) {
System.out.println("No data");
}
isAfterLast()
খালি ফলাফল সেটের জন্যও মিথ্যা প্রত্যাবর্তন করে তবে যেহেতু কার্সার যাইহোক প্রথম সারির আগে, এই পদ্ধতিটি আরও স্পষ্ট বলে মনে হয়।
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
কারণ যদি রেজাল্টসেটের কোনও কাঁচা না থাকে তবে resultSet.first
মিথ্যা ফিরিয়ে দেয়।
করণীয় হ'ল সর্বোত্তম বিষয় হ'ল প্রথম সারিটি পরীক্ষা করা যাতে আপনি যখন তথ্য পাওয়ার ইচ্ছা করেন তখন আপনি কোনও সারি বাদ দেওয়ার ভুল এড়াতে পারেন। এর মতো কিছু: যদি (! ফলাফলসেট.ফর্স্ট ())। System.out.println ("কোনও ডেটা নেই"); }
রেজাল্টসেট.নেক্সট () ব্যবহার করে আপনি সহজেই ফলাফলটি পেতে পারেন, ফলাফলসেটের কোনও মান রয়েছে কিনা তা
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");
}
যখন রেজাল্টসিটটি জনবহুল হয়, এটি প্রথম সারির আগে নির্দেশ করে। এটি প্রথম সারিতে স্থাপন করার সময় ( 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 অবজেক্টটি রেজাল্টসেট অবজেক্টটি শেষে যেতে এবং উপরে ফিরে যেতে সেট করতে হবে।
TYPE_SCROLL_SENSITIVE : রেজাল্টসেট অবজেক্টটি শেষে শিফট করে শীর্ষে ফিরে যেতে পারে। আরও শেষ পরিবর্তনগুলি ধরতে পারে।
CONCUR_READ_ONLY : আমরা রেজাল্টসেট অবজেক্ট ডেটা পড়তে পারি, তবে আপডেট করতে পারি না।
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
আমি মনে করি ফলাফল সেটটি যাচাইয়ের সহজতম উপায় হ'ল প্যাকেজ org.apache.commons.collections- এর আওতায় কালেকশন ইউটিলের মাধ্যমে lection
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
এটি নাল পাশাপাশি খালি ফলাফল সেট শর্ত পরীক্ষা করবে।
আরও বিশদ তথ্যের জন্য আপনি নিম্নলিখিত ডকটি দেখুন। CollectionUtils
আরএস.জেটরো () ব্যবহার করবেন না কেন?
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)" পরীক্ষা করে ঠিক মনে হচ্ছে ঠিক আছে।
আপনি এই মত কিছু করতে পারেন
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
করাই আরও ভাল বিকল্প।
প্রাথমিকভাবে, ফলাফল সেট অবজেক্ট (আরএস) বিএফআরকে নির্দেশ করে (প্রথম রেকর্ডের আগে)। একবার আমরা rs.next () ব্যবহার করি, কার্সারটি প্রথম রেকর্ডের দিকে নির্দেশ করে এবং আরএস "সত্য" ধারণ করে। ওয়েল লুপটি ব্যবহার করে আপনি টেবিলের সমস্ত রেকর্ড মুদ্রণ করতে পারেন। সমস্ত রেকর্ড পুনরুদ্ধার করার পরে, কার্সারটি ALR এ চলে যায় (শেষ রেকর্ডের পরে) এবং এটি বাতিল হয়ে যাবে। আসুন বিবেচনা করা যাক সারণিতে 2 টি রেকর্ড রয়েছে।
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
সংক্ষিপ্ত হাতে, আমরা যখন শর্তটি লিখতে পারি তখন (আরএস.এনেক্সট ())।