আমি java.sql.SesultSet এর আকারটি কীভাবে পাব?


284

এটি কি খুব সোজা কাজ নয়? তবে, আমি দেখতে পাচ্ছি একটি size()বা length()পদ্ধতি নেই method


11
আমি এই বাদ দেওয়ার কারণটি জানতে আগ্রহী।
স্ল্যামাইস

প্রশ্নের আমার বোঝাপড়াটি হ'ল আপনি ফলাফলের আকারটি বাইপিসের আকারের সন্ধান করতে চান, টিপলের সংখ্যা নয় ...
দেজনলিক

প্রক্রিয়া ডেটার আগে সঠিক মাত্রা না পাওয়া খুব বিরক্তিকর, তবে আপনি যদি এগুলিগুলিতে অ্যারেতে রাখতে চান তবে আপনি তালিকার মতো কোনও ডেটা স্ট্রাকচার ব্যবহার করে বিবেচনা করতে পারেন এবং তারপরে এটিকে টু অ্যারে () পদ্ধতিতে একটি অ্যারেতে রূপান্তর করতে পারেন।
AndreaTaroni86

উত্তর:


270

SELECT COUNT(*) FROM ...পরিবর্তে একটি জিজ্ঞাসা করুন।

অথবা

int size =0;
if (rs != null) 
{
  rs.last();    // moves cursor to the last row
  size = rs.getRow(); // get row id 
}

উভয় ক্ষেত্রেই আপনাকে পুরো ডেটা লুপ করতে হবে না।


8
শেষ () এবং getRow () ফলাফল ফলাফল শ্রেণিতে স্থির পদ্ধতি নয়।
জিবি

70
ব্রিভিটির পক্ষে আমি স্থির হোক না কেন তা বিবেচনা না করে অন্যদের সম্পর্কে লেখার সময় আমি সর্বদা এই ফ্যাশনে পদ্ধতিগুলি উল্লেখ করি। আসলে অবজেক্টের একটি উদাহরণ তৈরি করা এবং পদ্ধতিটি কল করা আবদ্ধ।
laz

51
আমি কম বিভ্রান্তির জন্য সামার ক্লাস.স্ট্যাটিক ম্যাথড () এবং সামারক্লাস # দৃষ্টান্তমাঠোদ () লিখি।
জেক

9
একটি কার্যকর করার সময় একজন কীভাবে ফেরত মূল্য আনবে select count?
নাফটুলি কে

16
ResultSet#last()নেই সব ধরনের কাজ ResultSetবস্তু, আপনি কি নিশ্চিতরূপে পারেন যে একটি ব্যবহার করতে হবে ResultSet.TYPE_SCROLL_INSENSITIVEবাResultSet.TYPE_SCROLL_SENSITIVE
Marius আয়ন

91
ResultSet rs = ps.executeQuery();
int rowcount = 0;
if (rs.last()) {
  rowcount = rs.getRow();
  rs.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element
}
while (rs.next()) {
  // do your standard per row stuff
}

5
যদি (আরএস.লাস্ট ()) কোড ব্লকের ভিতরে থাকে তবে সঠিক পদ্ধতিটি আরএস.ফার্স্ট () এর পরিবর্তে আরএস.বিফরফস্ট () হবে না? এইভাবে, আপনি যখন লুপটিতে প্রসেসিংয়ের জন্য আপনার ফলাফলের সেটটিতে প্রথম রেকর্ডটি এড়িয়ে যাচ্ছেন না।
karlgrz

আপনি কি যদি ব্লকের বাইরে প্রথমের দিকে কার্সারটি সেট করতে ভুলে যান না?
গোব্লিনস

রেজাল্টসেট ডক্স যেমন বলেছে, রেজাল্টসেটের getRow()জন্য কাজ করে TYPE_FORWARD_ONLYএবং এর beforeFirst()জন্য ত্রুটি ছুড়ে দেয়। তাহলে কি এই উত্তরটি ত্রুটিযুক্ত নয়?
কোডপ্রো_নোটইট

5
এটি কেবল তখনই কার্যকর হয় যখন বিবৃতিটি স্ক্রোল সংবেদনশীল বিকল্পের সাথে তৈরি করা হয়:ps=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
বুলিউইপ্ল্যাজা

19

ঠিক আছে, আপনার যদি ResultSetটাইপ থাকে তবে ResultSet.TYPE_FORWARD_ONLYআপনি এটি সেভাবেই রাখতে চান (এবং কোনওটিতে স্যুইচ না করা ResultSet.TYPE_SCROLL_INSENSITIVEবা ResultSet.TYPE_SCROLL_INSENSITIVEব্যবহার করতে সক্ষম হওয়ার জন্য.last() )।

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

উদাহরণ

আপনার জিজ্ঞাসাটি নিম্নলিখিতটি বলে is

select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR
from MYTABLE
where ...blahblah...

এবং আপনার আউটপুট মত দেখাচ্ছে

true    65537 "Hey" -32768 "The quick brown fox"
false  123456 "Sup"    300 "The lazy dog"
false -123123 "Yo"       0 "Go ahead and jump"
false       3 "EVH"    456 "Might as well jump"
...
[1000 total rows]

আপনার কোডটিকে এই জাতীয় কিছুতে কেবল রিফ্যাক্টর করুন:

Statement s=myConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                                         ResultSet.CONCUR_READ_ONLY);
String from_where="FROM myTable WHERE ...blahblah... ";
//h4x
ResultSet rs=s.executeQuery("select count(*)as RECORDCOUNT,"
                           +       "cast(null as boolean)as MYBOOL,"
                           +       "cast(null as int)as MYINT,"
                           +       "cast(null as char(1))as MYCHAR,"
                           +       "cast(null as smallint)as MYSMALLINT,"
                           +       "cast(null as varchar(1))as MYVARCHAR "
                           +from_where
                           +"UNION ALL "//the "ALL" part prevents internal re-sorting to prevent duplicates (and we do not want that)
                           +"select cast(null as int)as RECORDCOUNT,"
                           +       "MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR "
                           +from_where);

আপনার ক্যোয়ারী আউটপুটটি এখন এমন কিছু হবে

1000 null     null null    null null
null true    65537 "Hey" -32768 "The quick brown fox"
null false  123456 "Sup"    300 "The lazy dog"
null false -123123 "Yo"       0 "Go ahead and jump"
null false       3 "EVH"    456 "Might as well jump"
...
[1001 total rows]

সুতরাং আপনি ঠিক আছে

if(rs.next())
    System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count
while(rs.next())
    //do your stuff

আকর্ষণীয়, তবে আপনি কীভাবে গতিশীল / জেনারিকালি প্রথম নির্বাচিত বিবৃতি উত্পন্ন করবেন: MYBOOL হিসাবে কাস্ট (বুলিয়ান হিসাবে নাল), ect? তার জন্য আপনার কাছে "সিলেক্ট" স্টেটমেন্টের ক্ষেত্র এবং ডেটাটাইপগুলির দরকার হবে, যেমন বুলিয়ান, চর, ইনট, ইসট ... ... এর জন্য অতিরিক্ত ডিবি ট্রিপের প্রয়োজন হতে পারে যা সমস্ত সুবিধা বঞ্চিত করবে।
ব্যবহারকারী1697575

যখন আপনি সব ক্ষেত্র বিবরণ অ্যাক্সেস আছে এবং গতি আপনার প্রধান উদ্বেগের বিষয় (এবং ফাস্ট দিয়ে বিদ্ধ প্রয়োজন এটি উপযোগী ResultSet.TYPE_FORWARD_ONLY)
Unai স্বাগতম ভিভি

11
int i = 0;
while(rs.next()) {
    i++;
}

রেজাল্টসেটের আকারটি গণনা করতে এই পদ্ধতিটি ব্যবহার করার অসুবিধা কী তা আমি বুঝতে পারি না। এটি দুর্দান্ত ... অতিরিক্ত এসকিউএল প্যারামিটারের কোনও ব্যবহার নেই। এই পদ্ধতিতে মন্তব্য করুন।
ম্যাডিয়েডেক্সটার

5
পারফরম্যান্স এখানে মূল শব্দ। আপনার resultset কল্পনা 100M রেকর্ড তাহলে আপনার সমস্যা দেখতে হবে
পিয়ের

7
ফলাফলগুলি প্রক্রিয়া করার আগে আমি ফলাফলের আকারটি জানতে চাই কারণ আমার আগে থেকেই একই আকারের একটি অ্যারে তৈরি করা দরকার। এবং, অন্যান্য উত্তরে উল্লিখিত হিসাবে, সমস্ত সারি দু'বার স্ক্যান করা সর্বদা কার্যকর হবে না।
আইভো

11

আমি ব্যবহার করার সময় একটি ব্যতিক্রম পেয়েছিলাম rs.last()

if(rs.last()){
    rowCount = rs.getRow(); 
    rs.beforeFirst();
}

:

java.sql.SQLException: Invalid operation for forward only resultset

এটি পূর্বনির্ধারিত কারণে এটি ResultSet.TYPE_FORWARD_ONLY, যার অর্থ আপনি কেবলমাত্র ব্যবহার করতে পারবেনrs.next()

সমাধানটি হ'ল:

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY); 

12
থেকে স্যুইচ ResultSet.TYPE_FORWARD_ONLYকরতে ResultSet.TYPE_SCROLL_INSENSITIVEসাধারণত একটি মধ্যে incurs বিশাল কর্মক্ষমতা শাস্তি।
উনাই ভিভি

3
আমি এটি আমার টেবিলে পরীক্ষা করেছি (10 কলাম, 187 392 সারি)। আমার পরীক্ষাটি কোয়েরি করেছে এবং সমস্ত উপাদানগুলিকে স্ট্রিংয়ে লোড করেছে। TYPE_FORWARD_ONLY এর জন্য এটি প্রায় 1 সেকেন্ড সময় নিয়েছিল। TYPE_SCROLL_INSENSITIVE এর জন্য এটি প্রায় 7 সেকেন্ড সময় নিয়েছিল। আমি এর SELECT COUNT(*) FROM default_tblআগে যখন SELECT COUNT(*) FROM default_tblএটি ব্যবহার করতাম তখন এটি পুরোপুরি 1.5 সেকেন্ডেরও কম সময় নেয়। আমি এম্বেডড ডার্বি ডাটাবেস 10.11.1.1 এ পরীক্ষা করেছি
ভিট বার্নাটিক

4

রেজাল্টসেটের আকার পাওয়ার উপায়, অ্যারেলিস্ট ইত্যাদি ব্যবহারের দরকার নেই

int size =0;  
if (rs != null)   
{  
rs.beforeFirst();  
 rs.last();  
size = rs.getRow();
}

এখন আপনি আকার পাবেন এবং আপনি যদি ফলাফলের কোডটি নীচের কোডের লাইনটি ব্যবহার করার আগে মুদ্রণ করতে চান,

rs.beforeFirst();  

4

[গতির বিবেচনা]

এখানে অনেকগুলি পিপিএল পরামর্শ দেয় ResultSet.last()তবে এর জন্য আপনার সংযোগটি খুলতে হবে যেহেতু ResultSet.TYPE_SCROLL_INSENSITIVEডার্বি এম্বেড করা ডাটাবেসের চেয়ে 10 গুণ স্লোওয়ারের চেয়ে বেশি ResultSet.TYPE_FORWARD_ONLY

এম্বেড থাকা ডার্বি এবং এইচ 2 ডাটাবেসগুলির জন্য আমার মাইক্রো-পরীক্ষাগুলি অনুসারে SELECT COUNT(*)আপনার নির্বাচনের আগে কল করা উল্লেখযোগ্যভাবে দ্রুত ।

এখানে আমার কোড এবং আমার মানদণ্ডগুলিতে আরও বিশদে দেওয়া আছে


3

এটি সারি-গণনা করার একটি সহজ উপায়।

ResultSet rs = job.getSearchedResult(stmt);
int rsCount = 0;

//but notice that you'll only get correct ResultSet size after end of the while loop
while(rs.next())
{
    //do your other per row stuff 
    rsCount = rsCount + 1;
}//end while

4
হ্যাঁ, কাজ করে। তবে আমি মনে করি ওপিতে সারিগুলির সংখ্যাটি প্রক্রিয়াজাত করার আগে তাদের সংখ্যা জানার সাথে লড়াই করে। বাস্তব জীবনের কারণগুলির জন্য আমাকে এ পর্যন্ত লড়াই করতে হয়েছিল: ১) রেকর্ড সারিগুলির
বাক্যাংশ

ডেটা স্ট্রাকচারের আকারটি পূর্বনির্ধারণ করা অন্য কারণ। আমি প্রচুর লিবগুলিকে 10 টি এলিমেন্টের তালিকা ফিরিয়ে দেখেছি যখন কেবলমাত্র একক মান থাকে কারণ রেজাল্টসেটের সাথে দেবের একই সমস্যা ছিল।
জোসেফ লাস্ট

2
String sql = "select count(*) from message";
ps =  cn.prepareStatement(sql);

rs = ps.executeQuery();
int rowCount = 0;
while(rs.next()) {
    rowCount = Integer.parseInt(rs.getString("count(*)"));
    System.out.println(Integer.parseInt(rs.getString("count(*)")));
}
System.out.println("Count : " + rowCount);

1

আমি রেজাল্টসেট ইন্টারফেসের রানটাইম মানটি যাচাই করেছিলাম এবং এটি খুঁজে পেয়েছিলাম যে এটি পুরোপুরি একটি রেজাল্টসেটম্পল ছিল । রেজাল্টসেম্পল এর একটি পদ্ধতি রয়েছে getUpdateCount()যা আপনার সন্ধান করা মানটি দেয়।

এই কোড নমুনা যথেষ্ট হওয়া উচিত:
ResultSet resultSet = executeQuery(sqlQuery);
double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()

আমি বুঝতে পেরেছি যে ডাউন কাস্টিং সাধারণত একটি অনিরাপদ প্রক্রিয়া তবে এই পদ্ধতিটি এখনও আমাকে ব্যর্থ করে না।


2
টমক্যাট / মাইএসকিউএল নিয়ে কাজ করছেন না:java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingResultSet cannot be cast to com.mysql.jdbc.ResultSetImpl
পানু হারামো

1

আরএসের গণনা কেন জানি না আমি আজ এই যুক্তিটি ব্যবহার করেছি।

int chkSize = 0;
if (rs.next()) {
    do {  ..... blah blah
        enter code here for each rs.
        chkSize++;
    } while (rs.next());
} else {
    enter code here for rs size = 0 
}
// good luck to u.

0
theStatement=theConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet theResult=theStatement.executeQuery(query); 

//Get the size of the data returned
theResult.last();     
int size = theResult.getRow() * theResult.getMetaData().getColumnCount();       
theResult.beforeFirst();

0

আমি একই সমস্যা ছিল। ResultSet.first()মৃত্যুদন্ড কার্যকর হওয়ার ঠিক পরে এইভাবে ব্যবহার করা:

if(rs.first()){
    // Do your job
} else {
    // No rows take some actions
}

ডকুমেন্টেশন ( লিঙ্ক ):

boolean first()
    throws SQLException

এই ResultSetবস্তুর প্রথম সারিতে কার্সারটি সরানো হয় ।

রিটার্নস:

trueকার্সারটি যদি বৈধ সারিতে থাকে; falseযদি ফলাফল সেটটিতে কোনও সারি না থাকে

ছোঁড়ার:

SQLException- যদি একটি ডাটাবেস অ্যাক্সেস ত্রুটি ঘটে; এই পদ্ধতিটি একটি বন্ধ ফলাফল সেট বা ফলাফল সেট টাইপ হয়TYPE_FORWARD_ONLY

SQLFeatureNotSupportedException - যদি জেডিবিসি ড্রাইভার এই পদ্ধতিটি সমর্থন না করে

থেকে:

1.2


0

সবচেয়ে সহজ পদ্ধতির, রান কাউন্ট (*) ক্যোয়ারী, ফলাফলটি সেট.নেক্সট () প্রথম সারিতে নির্দেশ করার জন্য করুন এবং তারপরে গণনা পাওয়ার জন্য কেবল ফলাফলসেট.সেটস্ট্রিং (1) করুন। কোড:

ResultSet rs = statement.executeQuery("Select Count(*) from your_db");
if(rs.next()) {
   int count = rs.getString(1).toInt()
}

-1

কলাম একটি নাম দিন ..

String query = "SELECT COUNT(*) as count FROM

রেজাল্টসেট অবজেক্ট থেকে সেই কলামটি ইনট্রে অন্তর্ভুক্ত করুন এবং সেখান থেকে আপনার যুক্তিটি করুন ..

PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, item.getProductId());
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
    int count = resultSet.getInt("count");
    if (count >= 1) {
        System.out.println("Product ID already exists.");
    } else {
        System.out.println("New Product ID.");
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.