Avatar billede joe73 Nybegynder
19. juni 2003 - 10:40 Der er 8 kommentarer og
1 løsning

Antal rows i ResultSet? (Java og MS SQL server)

Hej

Jeg ønsker at finde ud af hvormange rows jeg har i et ResultSet fra min MSSQL DB og hertil bruger jeg følgende lille stump kode, men jeg får kun en SQLException tilbage hvor der står at ResultSet.beforeFirst er unsupported???
Jeg undre mig fordi kodestumpen virker fint sammen med MySQL?
Er der nogen der har en løsning?

public int getRows (ResultSet rs) throws SQLException 
{
  try
  {
    rs.last();
    return rs.getRow();
  }
  finally
  {
    rs.beforeFirst();
  }
}
Avatar billede elv Nybegynder
19. juni 2003 - 10:53 #1
Fra API'et:

public void beforeFirst() throws SQLException
Moves the cursor to the front of this ResultSet object, just before the first row. This method has no effect if the result set contains no rows.

Throws:
SQLException - if a database access error occurs or the result set type is TYPE_FORWARD_ONLY

Så vidt jeg ved kommer det an på din driver, hvilken type det er (tjek på statement.getResultSetType).

Jeg mener ikke der er andre muligheder end at lave en count, selvom det giver et ekstra db-kald.
Avatar billede elv Nybegynder
19. juni 2003 - 10:57 #2
Søgte lidt videre. Fandt en side der sagde, at hvis du henter rowset.jar fra sun, kan du caste den til et CachedRowSet som har en size()
Avatar billede arne_v Ekspert
19. juni 2003 - 11:09 #3
Statement stmt = conn.createStatement();
ResultSet rs = stmt.execute(sqlstr);

kan ikke scrolle baglæns.

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.execute(sqlstr);

bør kunne scrolle baglæns.

Bemærk at den for de fleste (alle ?) implementeringer gør det ved
at læse alle records op i memory. Ikke noget problem med 100
records. Stort pronlem med 100 millionber records.

De flester laver nok en:

SELECT COUNT(*) FROM ... WHERE ...

til at finde antallet med inden selve queryen.

[ja den kan godt nå at ændre sig mellem de 2 queries, men hvis
det f.eks. er til noget plads allokering kan man jo ligge lidt til]
Avatar billede joe73 Nybegynder
19. juni 2003 - 11:47 #4
Yep det virkede!
Tak
Avatar billede arne_v Ekspert
19. juni 2003 - 12:40 #5
rowset.jar ?
Avatar billede olly Nybegynder
19. juni 2003 - 14:49 #6
Ja Arne... Var også selv lidt overrasket... Men her er den:

http://developer.java.sun.com/developer/earlyAccess/crs/

Er lige ved selv at teste den...
Avatar billede arne_v Ekspert
19. juni 2003 - 15:56 #7
OK.

Men jeg formoder at den også læser alle records op i memory.
Avatar billede olly Nybegynder
19. juni 2003 - 17:16 #8
arne >>
Det tør jeg så ikke sige det virker fint med ca 1000 records... Men tør ikke sige det...
Avatar billede elv Nybegynder
19. juni 2003 - 17:30 #9
CachedRowSet henter alt data hjem, da den er beregnet til at man kan hente sine data og derefter disconnecte og stadigt arbejde videre med dem. Det kan derfor være et problem hvis man vil hente en million records, afhængigt at størrelsen, så der vil man nok anvende den traditionelle "select * from {tabel} where {query}", men til små forespørgsler er det formodentlig acceptabelt (igen afhængigt at størrelsen af posterne)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester