এটি কি খুব সোজা কাজ নয়? তবে, আমি দেখতে পাচ্ছি একটি size()
বা length()
পদ্ধতি নেই method
এটি কি খুব সোজা কাজ নয়? তবে, আমি দেখতে পাচ্ছি একটি size()
বা length()
পদ্ধতি নেই method
উত্তর:
SELECT COUNT(*) FROM ...
পরিবর্তে একটি জিজ্ঞাসা করুন।
অথবা
int size =0;
if (rs != null)
{
rs.last(); // moves cursor to the last row
size = rs.getRow(); // get row id
}
উভয় ক্ষেত্রেই আপনাকে পুরো ডেটা লুপ করতে হবে না।
select count
?
ResultSet#last()
নেই সব ধরনের কাজ ResultSet
বস্তু, আপনি কি নিশ্চিতরূপে পারেন যে একটি ব্যবহার করতে হবে ResultSet.TYPE_SCROLL_INSENSITIVE
বাResultSet.TYPE_SCROLL_SENSITIVE
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
}
getRow()
জন্য কাজ করে TYPE_FORWARD_ONLY
এবং এর beforeFirst()
জন্য ত্রুটি ছুড়ে দেয়। তাহলে কি এই উত্তরটি ত্রুটিযুক্ত নয়?
ps=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ঠিক আছে, আপনার যদি 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
ResultSet.TYPE_FORWARD_ONLY
)
int i = 0;
while(rs.next()) {
i++;
}
আমি ব্যবহার করার সময় একটি ব্যতিক্রম পেয়েছিলাম 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);
ResultSet.TYPE_FORWARD_ONLY
করতে ResultSet.TYPE_SCROLL_INSENSITIVE
সাধারণত একটি মধ্যে incurs বিশাল কর্মক্ষমতা শাস্তি।
SELECT COUNT(*) FROM default_tbl
আগে যখন SELECT COUNT(*) FROM default_tbl
এটি ব্যবহার করতাম তখন এটি পুরোপুরি 1.5 সেকেন্ডেরও কম সময় নেয়। আমি এম্বেডড ডার্বি ডাটাবেস 10.11.1.1 এ পরীক্ষা করেছি
[গতির বিবেচনা]
এখানে অনেকগুলি পিপিএল পরামর্শ দেয় ResultSet.last()
তবে এর জন্য আপনার সংযোগটি খুলতে হবে যেহেতু ResultSet.TYPE_SCROLL_INSENSITIVE
ডার্বি এম্বেড করা ডাটাবেসের চেয়ে 10 গুণ স্লোওয়ারের চেয়ে বেশি ResultSet.TYPE_FORWARD_ONLY
।
এম্বেড থাকা ডার্বি এবং এইচ 2 ডাটাবেসগুলির জন্য আমার মাইক্রো-পরীক্ষাগুলি অনুসারে SELECT COUNT(*)
আপনার নির্বাচনের আগে কল করা উল্লেখযোগ্যভাবে দ্রুত ।
এটি সারি-গণনা করার একটি সহজ উপায়।
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
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);
আমি রেজাল্টসেট ইন্টারফেসের রানটাইম মানটি যাচাই করেছিলাম এবং এটি খুঁজে পেয়েছিলাম যে এটি পুরোপুরি একটি রেজাল্টসেটম্পল ছিল । রেজাল্টসেম্পল এর একটি পদ্ধতি রয়েছে getUpdateCount()
যা আপনার সন্ধান করা মানটি দেয়।
এই কোড নমুনা যথেষ্ট হওয়া উচিত:
ResultSet resultSet = executeQuery(sqlQuery);
double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()
আমি বুঝতে পেরেছি যে ডাউন কাস্টিং সাধারণত একটি অনিরাপদ প্রক্রিয়া তবে এই পদ্ধতিটি এখনও আমাকে ব্যর্থ করে না।
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingResultSet cannot be cast to com.mysql.jdbc.ResultSetImpl
আরএসের গণনা কেন জানি না আমি আজ এই যুক্তিটি ব্যবহার করেছি।
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.
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();
আমি একই সমস্যা ছিল। 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
সবচেয়ে সহজ পদ্ধতির, রান কাউন্ট (*) ক্যোয়ারী, ফলাফলটি সেট.নেক্সট () প্রথম সারিতে নির্দেশ করার জন্য করুন এবং তারপরে গণনা পাওয়ার জন্য কেবল ফলাফলসেট.সেটস্ট্রিং (1) করুন। কোড:
ResultSet rs = statement.executeQuery("Select Count(*) from your_db");
if(rs.next()) {
int count = rs.getString(1).toInt()
}
কলাম একটি নাম দিন ..
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.");
}
}