Avatar billede chrfoss Nybegynder
11. maj 2009 - 17:59 Der er 12 kommentarer og
1 løsning

Print fra database

Hej,

overskriften er måske lidt misvisende, men kunne ikke lige komme på andet.

Jeg har en database der ser således ud:

|------------|
|varegrupper
|dyr
|biler
|------------|

hvor "varegrupper" indeholder et kolonne der hedder "navn" der indeholder 'dyr' og 'biler' som strings.

"dyr" indeholder fx. en Hest og "biler" indeholder fx en Ford, men det er dynamiske tabeller som jeg ikke kender navnet på. Derimod ved jeg at jeg kan finde navnene i "varegrupper".

Nu vil jeg gerne printe hele indholdet af både "dyr" og "biler".

Derfor laver jeg en forbindelse til min mySQL og har et ResultSet rs.

rs = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC")

Dette giver mig "dyr" og "biler".

Herefter laver jeg en query der skal vælge indholdet af "dyr" og "biler":

rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");

Men dette ser ikke ud til at fungere?
Jeg får også 2 forskellige fejl:
Before start of result set
After end og result set

Er der nogen der kan hjælpe?
Avatar billede chrfoss Nybegynder
11. maj 2009 - 18:06 #1
KODEN:

<%

    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "root";
    String password = "";
    Connection connection = null;
    ResultSet rs1 = null;
    ResultSet rs2 = null;
   
    // Establish connection                 
    connection = DriverManager.getConnection(url,username,password);
   
    // Create a statement object
    Statement s = connection.createStatement();
   
    rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
    rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");
   
    while (rs1.next() == true)
    {
       
        out.println(rs1.getString("navn"));
       
       
        //while (rs.next()){
        //out.println(rs.getString("itemname") + "<br>");
        //}
    }

    %>
Avatar billede arne_v Ekspert
11. maj 2009 - 18:07 #2
Det lyder som om du ikke faar kaldt rs.next() !
Avatar billede arne_v Ekspert
11. maj 2009 - 18:09 #3
rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
while(rs1.next()) {
    rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");
    while(rs2.next()) {
    }
}


vil jeg tro.
Avatar billede chrfoss Nybegynder
11. maj 2009 - 18:22 #4
Jeg får en "Operation not allowed after ResultSet closed"

på while(rs1.next()) { ...
Avatar billede arne_v Ekspert
11. maj 2009 - 18:28 #5
Hvor kalder du close ?
Avatar billede chrfoss Nybegynder
11. maj 2009 - 18:48 #6
rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
    while (rs1.next()) {
        rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");
        while (rs2.next()) {
        }
    }
    rs1.close();
    rs2.close();
    s.close();
Avatar billede arne_v Ekspert
11. maj 2009 - 18:56 #7
rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
    while (rs1.next()) {
        rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");
        while (rs2.next()) {
            // whatever
        }
        rs2.close();
    }
    rs1.close();
    s.close();

boer ikke give den fejl.
Avatar billede chrfoss Nybegynder
11. maj 2009 - 19:03 #8
Giver samme fejl på linien med while(rs1.next()) { ...

Jeg fatter det ikke :S

<%

    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "eshop";
    String password = "";
    Connection connection = null;
    ResultSet rs1 = null;
    ResultSet rs2 = null;
   
    // Establish connection                 
    connection = DriverManager.getConnection(url,username,password);
   
    // Create a statement object
    Statement s = connection.createStatement();
   
   
    rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
    while (rs1.next()) {
        rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");
        while (rs2.next()) {
            // whatever
        }
        rs2.close();
    }
    rs1.close();
    s.close();

    %>
Avatar billede arne_v Ekspert
11. maj 2009 - 19:13 #9
Ah.

Proev lige med 2 connections og 2 statements - en til hver query.
Avatar billede arne_v Ekspert
11. maj 2009 - 19:15 #10
con1 = DriverManager.getConnection(url,username,password);
    s1 = connection.createStatement();
    rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
    while (rs1.next()) {
        con2 = DriverManager.getConnection(url,username,password);
        s2 = connection.createStatement();
        rs2 = s.executeQuery("SELECT itemname FROM " + rs1.getString("navn") + "");
        while (rs2.next()) {
            // whatever
        }
        rs2.close();
        s2.close();
        con2.close();
    }
    rs1.close();
    s1.close();
    con1.close();
Avatar billede chrfoss Nybegynder
11. maj 2009 - 19:19 #11
JA for faen!
Jeg har ikke rigtig nogen idé om hvorfor der skal 2 forbindelser til, men det virker.
Endelig kode:

<%

    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "eshop";
    String password = "";
    Connection connection = null;
    Connection connection2 = null;
    ResultSet rs1 = null;
    ResultSet rs2 = null;
   
    // Establish connection                 
    connection = DriverManager.getConnection(url,username,password);
    connection2 = DriverManager.getConnection(url,username,password);
   
    // Create a statement object
    Statement s = connection.createStatement();
    Statement s2 = connection2.createStatement();
   
   
    rs1 = s.executeQuery("SELECT * FROM varegrupper ORDER BY navn ASC");
    while (rs1.next()) {
        rs2 = s2.executeQuery("SELECT * FROM " + rs1.getString("navn") + "");
        while (rs2.next()) {
            out.println("Navn: " + rs2.getString("itemname") + "<br>");
            out.println("Pris: " + rs2.getString("price") + "<br>");
            out.println("Info: " + rs2.getString("info") + "<br><br>");
        }
        rs2.close();
    }
    rs1.close();
    s.close();

    %>

TAK!
Avatar billede arne_v Ekspert
11. maj 2009 - 19:25 #12
Det er noedvendigt fordi executeQuery (normalt) ikke henter alle raekker - det er faktisk next kaldet som henter en ny raekke. Og man kan ikke blande resultater fra 2 queries sammen paa en enkelt connection.

Det er et kendt problem. Jeg var vare lidt sloev til at gennemskue det p.g.a. fejlmeddelserne der indikerede noget helt andet.
Avatar billede arne_v Ekspert
11. maj 2009 - 19:25 #13
Og et svar.
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