Avatar billede rellin Nybegynder
14. maj 2002 - 22:06 Der er 12 kommentarer og
3 løsninger

resultset.next()

Jeg bruger et resultset fra en databaseforespørgsel til at sætte nogle oplysninger ind i en Gui.
Jeg bruger så next()-metoden til at bladre i resultsettet, hvorved oplysningerne i Gui'en også ændres. Men når jeg når til det sidste resultat i resultsettet og kører next(), kaster den en exception. Hvordan undgår jeg dette.

Jeg har prøvet med:

if(rs.next())
{
}

...men det virker ikke
Avatar billede Slettet bruger
14. maj 2002 - 22:09 #1
if(!rs.next()==null){
}
Avatar billede erikjacobsen Ekspert
14. maj 2002 - 22:12 #2
Du skal kunne spørge med
 
  if(rs.next())

så det må være noget andet. Må vi se mere kode?
Avatar billede a-torsten Nybegynder
14. maj 2002 - 22:19 #3
hva med

if(!rs.EOF)
{
  // Hvis der er poster i databasen...
}
Avatar billede disky Nybegynder
14. maj 2002 - 22:22 #4
Alle de løsninger der er nævnt er ikke den korrekte måde at gøre det på, den korrekte måde ifølge API'en er

while(rs.next())
{
  //her henter du så data ud fra resultset
}

med den metode kommer der aldrig en exception, bortset fra hvis resultset er null hvilket kun kan ske, hvis din statement ikke er i orden.

Se evt. java.sql.* api'en
Avatar billede rellin Nybegynder
14. maj 2002 - 22:26 #5
Men jeg vil ikke hente alle data ud af resultsettet, jeg vil bare hente data for den aktuelle så de kan lægges ind i en Gui, og automatisk ændres, næste gang rs.next() køres.
Er det virkelig nødvendigt at lægge det ind i f.eks. et array først?
Avatar billede erve Nybegynder
14. maj 2002 - 22:52 #6
Jeg vil give a-torsten ret:
if(rs.next())
{
}
er en helt korrekt måde at gøre det på. Så der er et eller andet galt. Prøv at vise noget mere kode. Er det f.eks en "select max(kolonnenavn)" kan det godt give et underligt resultat, hvis der ikke er noget resultat af forespørgslen.
Avatar billede Slettet bruger
14. maj 2002 - 23:24 #7
Den måde som jeg vil gøre det på er meget lig disky's. Jeg vil ligge det hele over i en array eller vector også løbe den igennem for det som jeg skal bruge. Men det er jo oxo bare en måde som alle andre :-)
Avatar billede soelvpil Nybegynder
15. maj 2002 - 08:10 #8
Hvad siger din exception? NullPointer? Connection closed? Timeout fra databasen?

Vis os en exception.printStackTrace(), så bliver vi sikkert alle meget klogere. Kommer fejlen altid på den sidste, uanset hvor mange der er?

Kan du sende koden for den klasse der snakker med databassen? Bliver det godt vejr i weekenden?
Avatar billede disky Nybegynder
15. maj 2002 - 09:16 #9
rellin, hvis du via din select statement henter mere end en record fra databasen er det fornuftigt at kopiere indhold over i en java.util.List for at kunne frigive resultset'et igen hurtigt.

Men hvis dit resultset er gyldigt, virker if(rs.next()) også. Hvis det ikke gør skyldes det at du har et helt andet problem.
Avatar billede rellin Nybegynder
15. maj 2002 - 11:41 #10
Den expetion jeg får lyder som følger:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Cursor-tilstanden er ugyldig.

Fejlen kommer altid først når jeg står i den sidste, og prøver at køre next() en gang til, uanset hvor mange der er.

Antallet af records er variabelt.

Her er klassen jeg bruger til at oprette forbindelsen til databasen:

import java.sql.*;

class Databaseadgang
{
  private Connection conn;
  Statement sta;

  public Databaseadgang()
  {
    try
    {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch (ClassNotFoundException c)
    {
    }

    try
    {
      conn = DriverManager.getConnection("jdbc:odbc:DBNavn");
      sta    = conn.createStatement();

    }
    catch (SQLException s)
    {
    }

  }

    public void lukdatabase()
    {
        try
    {
        conn.close();
    }
    catch (SQLException s)
    {
    }
    }

}
Avatar billede disky Nybegynder
15. maj 2002 - 13:16 #11
der er ikke noget i den klasse der tillader udførsel af queries.
Avatar billede rellin Nybegynder
15. maj 2002 - 13:39 #12
Det gør jeg inde i min anden klasse, hvor jeg også udfører forespørgslen:

String query = "SELECT...........;";

try
    {
    rs = dba.sta.executeQuery(query);                    if(rs.next())   
        {
        }
    }
    catch (SQLException e)
    {
    }
Avatar billede rellin Nybegynder
15. maj 2002 - 14:38 #13
Jeg har løst problemet. Jeg har tilføjet argumentet.

sta = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

så, jeg også kan bladre tilbage i rs. Og ændret metoden til:

if(rs.next() == false)
{
    rs.first();
}

Dette gør så, at når man har løbet hele rs igennem startes forfra fra den første post igen. Ikke optimalt, men bedre end en exception...
Avatar billede soelvpil Nybegynder
15. maj 2002 - 17:24 #14
Jeg tør vædde med, at din fejl skyldes en off-by-one, d.v.s. at du kalder rs.getString("navn") o.s.v EFTER rs.next() har returneret false, d.v.s. du forsøger at læse fra en ikke-eksisterende række.

Måske et eller andet med at du kalder rs.next() og herefter forsøger at vise den aktuelle række (som så ikke længere vises).

En mulighed kunne være, at du forud kalder rs.next() for at se, om der skal være en bladre-frem-knap. Men så skal du naturligvis ikke kalde den i det øjeblik, du faktisk bladrer (men nok for den første).
Avatar billede rellin Nybegynder
16. maj 2002 - 00:52 #15
Tak i får alligevel lidt ... tror jeg nok ! ;-)
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