Toon posts:

[JAVA] while(resultSet.next()) bij ResultSet werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik ben bezig met gegevens uit een SQL 2000 db te halen.

Ik heb een hele simpele query, die 100% zeker een waarde teruggeeft aan mijn ResultSet.

Als ik de resultSet wil doorlopen, om de waarde in een lijst te zetten, loopt hij niet door de while loop.

iemand een id hoe dit kan?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
resultSet = dbConn.ExecQuery("SELECT * FROM WERKGEVER WHERE naam_werkgever = 'test');
                
        try
        {

            while(resultSet.next())
            {
                String naam = resultSet.getString("naam_werkgever");
                System.out.println("WERKGEVER: "+naam); 
                Werkgever w = new Werkgever(naam);
                lijst.add(w);
            }
            
            System.out.println("resultSet leeg");
        }
        catch(Exception e)
        {
            errorMessage.showMessageDialog(app, "Fout bij het laden van de lijst met werkgevers "+e, "Fout", 
                                                JOptionPane.OK_OPTION);
        }

  • Casteloni
  • Registratie: November 2001
  • Laatst online: 02-05 20:41
Weet je zeker dat de database connectie goed is? Ik zie dat nog een " vergeten bent bij het uitvoeren van je query. Verder zou je je app eens kunnen debuggen en kijken wat er dan wel in je resultset zit.

Van welke type is dbConn? Als ik een query op een database wil afvuren gebruik ik namelijk een Statement en de methode executeQuery of executeUpdate.

[ Voor 31% gewijzigd door Casteloni op 06-07-2005 11:53 ]


  • JnX
  • Registratie: Februari 2001
  • Laatst online: 18-01 22:08

JnX

In je while loop zit niet de fout. De fout zal in de eerste regel van je code zitten die je hier geeft. Na je statement staat er geen " om je query af te sluiten.

Ten tweede:
Van welke klasse is dbConn? En wat is ExecQuery?

De manier waarop jij een query uitvoert is mij niet bekend. Ik zou het eens zo proberen (zo gebruik ik het altijd):

Java:
1
2
3
4
5
6
Statement st = con.createStatement();
resultSet = st.executeQuery("SELECT * FROM WERKGEVER WHERE naam_werkgever = 'test'");

while (resultSet.next())
{
}


NB. ik ga er van uit dat je een connectie met de database hebt, genaamd con (van de klasse Connection)..

Ow, iemand was me voor :>

[ Voor 20% gewijzigd door JnX op 06-07-2005 11:56 ]


Verwijderd

Topicstarter
VampireSlayer schreef op woensdag 06 juli 2005 @ 11:50:
Weet je zeker dat de database connectie goed is? Ik zie dat nog een " vergeten bent bij het uitvoeren van je query. Verder zou je je app eens kunnen debuggen en kijken wat er dan wel in je resultset zit.

Van welke type is dbConn? Als ik een query op een database wil afvuren gebruik ik namelijk een Statement en de methode executeQuery of executeUpdate.
ik zal hier even een stukje code neer zetten van mijn DatabaseConnection klasse die ik geschreven heb. dbConn heeft als type DatabaseConnection.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public ResultSet ExecQuery(String strSQL)
    {
        OpenConnection();
        
        try 
        {
            System.out.println(strSQL);
            Statement stmt = myConn.createStatement();
            myResultSet = stmt.executeQuery( strSQL );
        }
        catch( SQLException e )
        {
            System.out.println("Fout bij het ExecQuery: "+e);
        }
        
        CloseConnection();
        return myResultSet;
    }


de " heb ik vergeten maar daar komt hij natuurlijk automatisch mee tijdens compilen.
ik had even voor op dit forum naam van de werkgever aangepast, en daarbij de " vergeten.
dat is het iig dus niet :)

ik gebruik overigens overal deze manier, en ik krijg gewoon de data behalve bij deze query.
Als ik de query uitvoer in SQL Query Analyzer, krijg ik gewoon data te zien.

[ Voor 9% gewijzigd door Verwijderd op 06-07-2005 12:08 ]


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 02-05 20:41
Wel apart dat je andere queries goed gaan en deze juist niet. Als ik het goed begrijp krijg je ook geen SQLException?

Waar heb je je myResultSet variabele gedeclareerd? Je wijst er namelijk naar als je de data terug krijgt bij het uitvoeren van de query en returned deze vervolgens, maar ik zie nergens een declaratie.

Verder zou je bijv kunnen debuggen wat er in de resultset zit vlak na het uitvoeren van de query, bijvoorbeeld het aantal rows.

Verwijderd

Topicstarter
VampireSlayer schreef op woensdag 06 juli 2005 @ 12:14:
Wel apart dat je andere queries goed gaan en deze juist niet. Als ik het goed begrijp krijg je ook geen SQLException?

Waar heb je je myResultSet variabele gedeclareerd? Je wijst er namelijk naar als je de data terug krijgt bij het uitvoeren van de query en returned deze vervolgens, maar ik zie nergens een declaratie.

Verder zou je bijv kunnen debuggen wat er in de resultset zit vlak na het uitvoeren van de query, bijvoorbeeld het aantal rows.
Ik heb de resultSet aan het begin van de klasse gedeclareerd. Ik weet alleen eerlijk gezeg niet hoe dat debuggen werkt... 8)7

ik heb met:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
resultSet = dbConn.ExecQuery("SELECT * FROM WERKGEVER WHERE NAAM_WERKGEVER = 'Glaswacht de C.V.'");
                
        try
        {
            System.out.println("aantalRijen: "+resultSet.getRow());
            while(resultSet.next())
            {
                String naam = resultSet.getString("naam_werkgever");
                System.out.println("WERKGEVER: "+naam);
                Werkgever w = new Werkgever(naam);
                lijst.add(w);
            }
            
            System.out.println("resultSet leeg");
        }
        catch(Exception e)
        {
            errorMessage.showMessageDialog(app, "Fout bij het laden van de lijst met werkgevers "+e, "Fout", 
                                                JOptionPane.OK_OPTION);
        }


gekeken hoeveel rijen erin zitten, heel verassend dus 0. Maar ik begrijp dat dus niet, want de query geeft in SQL Query Analyzer gewoon 1 rij.

[ Voor 37% gewijzigd door Verwijderd op 06-07-2005 12:17 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Sowieso zou ik je exception handling wat beter afhandelen. Veel fout informatie gaat nu verloren. Sowieso raad ik aan om log4j te gebruiken, maar tot die tijd kun je het beste ook een e.printStackTrace() doen. Daarnaast zou ik de execQuery gewoon een SQLException laten throwen ipv het in een try catch te zetten.

Is myResultSet een global variabele? Ik zie hem nergens gedefinieerd worden binnen de methode.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 02-05 20:41
Verwijderd schreef op woensdag 06 juli 2005 @ 12:16:
[...]


Ik heb de resultSet aan het begin van de klasse gedeclareerd. Ik weet alleen eerlijk gezeg niet hoe dat debuggen werkt... 8)7
Je kan op verschillende manieren debuggen. System.out's hebben de minste voorkeur. Log4j is eigenlijk ook niet echt voor debuggen bedoeld maar is in ieder geval wel beter. Als je eclipse gebruikt ( of een andere IDE ) kan je een aantal breakpoints in je applicatie zetten. Bij het debuggen pauzeert de applicatie met het uitvoeren van de actie en kan je kijken wat voor waarden je variabelen hebben.

edit: Je zou eventueel je while loop kunnen verplaatsen naar de execQuery methode, misschien dat je daar meer resultaten krijgt. Wat is de output van de verschillende System.out's?

[ Voor 13% gewijzigd door Casteloni op 06-07-2005 12:24 ]


  • misfire
  • Registratie: Maart 2001
  • Laatst online: 12-10-2024
Je closed de connectie voordat je met de resultset aan de slag gaat. Probeer het eens met een open connectie.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 05-05 21:38

Robtimus

me Robtimus no like you

Verwijderd schreef op woensdag 06 juli 2005 @ 12:16:
code:
1
System.out.println("aantalRijen: "+resultSet.getRow());

gekeken hoeveel rijen erin zitten, heel verassend dus 0. Maar ik begrijp dat dus niet, want de query geeft in SQL Query Analyzer gewoon 1 rij.
Uit de API van ResultSet.getRow():
Retrieves the current row number. The first row is number 1, the second number 2, and so on.

Returns:
the current row number; 0 if there is no current row
Op het moment van aanroep is er nog geen rij geselecteerd in de resultset (mbv next()), dus wordt er standaard 0 gereturned.
Er is helaas geen snelle methode om de grootte van een resultset op te vragen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
misfire schreef op woensdag 06 juli 2005 @ 12:53:
Je closed de connectie voordat je met de resultset aan de slag gaat. Probeer het eens met een open connectie.
zo even pauze gehad :)

die connectie open of dicht maakt niet uit, omdat ik deze functie voor andere resultSets ook gebruik en die zijn wel gevuld.

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Ga eens kijken naar Hibernate?! Zelf JDBC code schrijven doe je toch niet meer... vooral niet waarvoor jij het gebruikt (aan je code voorbeeld te zien) :)

En JDBC code in je User Interface ?!?! Erg netjes :P

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
resultSet = dbConn.ExecQuery("SELECT * FROM WERKGEVER WHERE naam_werkgever = 'test');
        
        try
        {              
            // Dit toevoegen
            resultSet.beforeFirst();

            while(resultSet.next())
            {
                String naam = resultSet.getString("naam_werkgever");
                System.out.println("WERKGEVER: "+naam); 
                Werkgever w = new Werkgever(naam);
                lijst.add(w);
            }
            
            System.out.println("resultSet leeg");
        }
        catch(Exception e)
        {
            errorMessage.showMessageDialog(app, "Fout bij het laden van de lijst met werkgevers "+e, "Fout", 
                                                JOptionPane.OK_OPTION);
        }

[ Voor 50% gewijzigd door Stephan Oudmaijer op 06-07-2005 13:27 ]


Verwijderd

In theorie maakt het wel heel veel uit. Tenzij je een cached resultset hebt kun je alleen data eruit halen bij een open connectie. Probeer het gewoon eens met een open connectie, ondanks dat je andere queries wel goed gaan met gesloten.

Verwijderd

Topicstarter
VampireSlayer schreef op woensdag 06 juli 2005 @ 12:23:
[...]

Je kan op verschillende manieren debuggen. System.out's hebben de minste voorkeur. Log4j is eigenlijk ook niet echt voor debuggen bedoeld maar is in ieder geval wel beter. Als je eclipse gebruikt ( of een andere IDE ) kan je een aantal breakpoints in je applicatie zetten. Bij het debuggen pauzeert de applicatie met het uitvoeren van de actie en kan je kijken wat voor waarden je variabelen hebben.

edit: Je zou eventueel je while loop kunnen verplaatsen naar de execQuery methode, misschien dat je daar meer resultaten krijgt. Wat is de output van de verschillende System.out's?
Ik heb even gedebugged, toen kreeg ik wel de waarde die ik wil zien.
Ik heb daarna opnieuw gecompiled en gerund en toen deed hij het wel, ik heb qua code niks veranderd, alleen opnieuw de db ververst. :? :?

Verwijderd

Topicstarter
CK schreef op woensdag 06 juli 2005 @ 13:26:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
resultSet = dbConn.ExecQuery("SELECT * FROM WERKGEVER WHERE naam_werkgever = 'test');
        
        try
        {              
            // Dit toevoegen
            resultSet.beforeFirst();

            while(resultSet.next())
            {
                String naam = resultSet.getString("naam_werkgever");
                System.out.println("WERKGEVER: "+naam); 
                Werkgever w = new Werkgever(naam);
                lijst.add(w);
            }
            
            System.out.println("resultSet leeg");
        }
        catch(Exception e)
        {
            errorMessage.showMessageDialog(app, "Fout bij het laden van de lijst met werkgevers "+e, "Fout", 
                                                JOptionPane.OK_OPTION);
        }
dit werkte overigens niet, kreeg de foutmelding dat de resultset type een ONLY_FORWARD type is

en ik zal eens gaan kijken naar Hibernate, ik wist niet eens dat zoiets bestond....

[ Voor 10% gewijzigd door Verwijderd op 06-07-2005 14:40 ]


Verwijderd

Als je toch even gaat kijken, kijk dan ook es naar iBatis. Dit framework is een stukje minder zwaar dan hibernate.

Verwijderd

Wat misfire en leeko ook al gezegd hebben: die closed connection zorgt waarschijnlijk voor het probleem. Ik heb hier ook problemen mee gehad, met precies zo'n zelfde constructie.

Ik heb er toen voor gekozen om een connection pool te gebruiken: proxool. Het is een rotklus om alles om te schrijven, maar wel de moeite waard.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 05-05 21:38

Robtimus

me Robtimus no like you

Die beforeFirst() is totaal niet nodig want standaard staat elke ResultSet al in de beforeFirst stand (zie API). beforeFirst() is er alleen maar om je ResultSet weer opnieuw te kunnen doorlopen. Gewoon weglaten dus.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 10:33
Ik kan het verkeerd hebben, maar is het niet zo dat je met een ResultSet altijd eerst een next() moet uitvoeren om resultaat te krijgen?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
resultSet = dbConn.ExecQuery("SELECT * FROM WERKGEVER WHERE naam_werkgever = 'test'");
        
        try
        {              
            // zo dus -->
            resultSet.next();

            while(resultSet.next())
            {
                String naam = resultSet.getString("naam_werkgever");
                System.out.println("WERKGEVER: "+naam); 
                Werkgever w = new Werkgever(naam);
                lijst.add(w);
            }

        }
        catch(Exception e)
        {
            errorMessage.showMessageDialog(app, "Fout bij het laden van de lijst met werkgevers "+e, "Fout", 
                                                JOptionPane.OK_OPTION);
        }


Nogmaals, ik weet het niet zeker, maar volgens mij heb ik dit probleem eerder gezien.

[ Voor 13% gewijzigd door Daspeed op 07-07-2005 11:14 . Reden: Moet ik wel goed copy/pasten ... ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 05-05 21:38

Robtimus

me Robtimus no like you

Heel duidelijk: nee.

Als een RS net gecreeerd is staat de pointer voor het eerste record. Met next schuif je hem dan op naar het eerste. Maar dat doe je in de loop condition al.
Java:
1
2
3
4
5
6
7
ResultSet rs; // creatie hier; pointer staat voor het eerste record
while (rs.next())
{
    // na de eerste keer staat de pointer op het eerste record, na de tweede keer op het tweede, etc
    // code
}
// de pointer staat na het laatste record; als er geen records waren ook meteen voor het eerste

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 10:33
Je hebt gelijk, maar ik heb ooit ook eens een situatie gezien waar eerst next() gedaan moest worden om uiteindelijk results terug te krijgen uit een resultset en daardoor dacht ik dat het altijd wel zo zou moeten. Maar goed, zoals ik al zei: ik weet het niet zeker (het is ook onlogisch). Ik vermoed echter dat de pointer gewoon ergens verkeerd staat, dus misschien moet de TS maar eens met first(), next() en getRow() gaan spelen.
Pagina: 1