it-swarm.com.de

Wie erhalte ich die Größe eines Java.sql.ResultSet?

Sollte dies nicht eine ziemlich einfache Operation sein? Ich sehe jedoch weder eine size() noch length() Methode.

255
Jake

Führen Sie stattdessen eine SELECT COUNT(*) FROM ...-Abfrage aus.

OR

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

In beiden Fällen müssen Sie nicht die gesamten Daten durchlaufen.

242
finnw
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
}
80
JeeBee

Wenn Sie eine ResultSet vom Typ ResultSet.TYPE_FORWARD_ONLY haben, möchten Sie es auf diese Weise beibehalten (und nicht , um zu einem ResultSet.TYPE_SCROLL_INSENSITIVE oder ResultSet.TYPE_SCROLL_INSENSITIVE zu wechseln, um .last() verwenden zu können).

Ich empfehle einen sehr netten und effizienten Hack, bei dem Sie oben eine erste falsche/falsche Reihe hinzufügen, die die Anzahl der Reihen enthält.

Beispiel

Nehmen wir an, Ihre Anfrage lautet wie folgt

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

und deine Ausgabe sieht aus wie

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]

Refactorieren Sie einfach Ihren Code in etwas wie:

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

Ihre Query-Ausgabe wird nun etwa so aussehen

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]

Also musst du nur

if(rs.next())
    System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count
while(rs.next())
    //do your stuff
17
Unai Vivi
int i = 0;
while(rs.next()) {
    i++;
}
12
bhaskar

Ich habe eine Ausnahme bei der Verwendung von rs.last()

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

:

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

standardmäßig ist es ResultSet.TYPE_FORWARD_ONLY, was bedeutet, dass Sie nur rs.next() verwenden können.

Die Lösung ist:

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

Es ist eine einfache Möglichkeit, Zeilen zu zählen. 

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
CounterSpell

[Geschwindigkeitsüberlegung]

Viele ppl hier schlagen ResultSet.last() vor, aber dafür müssten Sie die Verbindung als ResultSet.TYPE_SCROLL_INSENSITIVE öffnen, der für die eingebettete Derby-Datenbank LANGSAMER ist als ResultSet.TYPE_FORWARD_ONLY.

Laut meinen Mikrotests für eingebettete Derby- und H2-Datenbanken ist es wesentlich schneller, SELECT COUNT(*) vor Ihrem SELECT aufzurufen. 

Hier ist ausführlicher mein Code und meine Benchmarks

3
Vit Bernatik

Die Möglichkeit, die Größe von ResultSet zu ermitteln, ArrayList muss nicht verwendet werden

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

Jetzt erhalten Sie die Größe. Wenn Sie das ResultSet drucken möchten, verwenden Sie auch die folgende Codezeile.

rs.beforeFirst();  
3
Anptk
        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
Peter.Chu

Ich habe den Laufzeitwert der Schnittstelle ResultSet überprüft und festgestellt, dass es sich die ganze Zeit um ResultSetImpl handelt. ResultSetImpl verfügt über eine Methode namens getUpdateCount(), die den gesuchten Wert zurückgibt.

Dieses Codebeispiel sollte ausreichen:
ResultSet resultSet = executeQuery(sqlQuery);
double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()

Mir ist klar, dass Downcasting im Allgemeinen ein unsicheres Verfahren ist, aber diese Methode hat mich noch nicht enttäuscht.

1
clausavram

Heute habe ich diese Logik verwendet, warum ich nicht weiß, wie man RS zählt.

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.
1
parksangdonews
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
Ben

Gib der Spalte einen Namen ..

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

Referenzieren Sie diese Spalte aus dem ResultSet-Objekt in ein int und führen Sie Ihre Logik von dort aus aus.

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

Ich hatte das gleiche Problem. Verwenden Sie ResultSet.first() auf diese Weise, nachdem die Ausführung es gelöst hat:

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

Dokumentation ( link ):

boolean first()
    throws SQLException

Bewegt den Cursor in die erste Zeile dieses ResultSet-Objekts. 

Kehrt zurück: 

true, wenn sich der Cursor auf einem gültigen .__ befindet. Reihe; false wenn in der Ergebnismenge keine Zeilen vorhanden sind 

Wirft: 

SQLException - wenn ein Datenbankzugriffsfehler auftritt; Diese Methode wird für eine geschlossene Ergebnismenge aufgerufen, oder der Typ der Ergebnismenge ist TYPE_FORWARD_ONLY.

SQLFeatureNotSupportedException - wenn der JDBC-Treiber .__ nicht unterstützt. diese Methode 

Schon seit:

1.2

0