यह एक बहुत सीधा ऑपरेशन नहीं होना चाहिए? हालाँकि, मैं देख रहा हूँ कि न तो कोई विधि है size()
और न ही कोई length()
विधि।
यह एक बहुत सीधा ऑपरेशन नहीं होना चाहिए? हालाँकि, मैं देख रहा हूँ कि न तो कोई विधि है size()
और न ही कोई length()
विधि।
जवाबों:
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()
मैं एक बहुत अच्छी और कुशल हैक का सुझाव देता हूं, जहां आप शीर्ष पर पहली बोगस / फोनी पंक्ति जोड़ते हैं जिसमें पंक्तियों की संख्या होती है।
उदाहरण
मान लें कि आपकी क्वेरी निम्नलिखित है
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
आम तौर पर एक में पड़ता है विशाल प्रदर्शन की सजा।
SELECT COUNT(*) FROM default_tbl
पहले SELECT COUNT(*) FROM default_tbl
इसका इस्तेमाल किया तो यह पूरी तरह से 1.5 सेकंड से भी कम समय लगा। मैंने एम्बेडेड डर्बी डेटाबेस 10.11.1.1
ResultSet का आकार प्राप्त करने का तरीका, ArrayList आदि का उपयोग करने की कोई आवश्यकता नहीं है
int size =0;
if (rs != null)
{
rs.beforeFirst();
rs.last();
size = rs.getRow();
}
अब आपको आकार मिलेगा, और यदि आप कोड का निम्नलिखित लाइन का उपयोग प्रिंट करने से पहले ResultSet प्रिंट करना चाहते हैं,
rs.beforeFirst();
[गति पर विचार]
Ppl के बहुत यहाँ पता चलता है 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);
मैंने ResultSet इंटरफ़ेस के रनटाइम मान की जाँच की और पाया कि यह हर समय एक ResultSetImpl बहुत अधिक था । ResultSetImpl में एक विधि होती है, जिसे 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
- अगर JDBC ड्राइवर इस विधि का समर्थन नहीं करता हैजबसे:
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.");
}
}