Avatar billede hepou Nybegynder
15. maj 2003 - 19:51 Der er 21 kommentarer og
1 løsning

Sql - 2 objekter i én vector ud fra 2 tabeller

Jeg har 3 tabeller i en access-database, (Pc, Lokale og PcILokale)hvoraf PcILokale består af et PcNr fra Pc og et LokaleNr fra Lokale.

Jeg skal have lavet en PcILokaleVector der består af et Pc-object og et lokale-object. Herefter skal der laves en udskrift af hvilke pc'er der hører til hvilke lokaler.

Er der nogen der kan hjælpe med det???



Jeg har følgende forslag, der kun udskriver den 1. første
række i tabellen:

----------------------Vector------------------------------
    public Vector getPcILokaleVector()
    {
        db.open();
        String sql1 = "SELECT * FROM Pc LEFT JOIN PcILokale ON Pc.PcNr = PcILokale.PcNr ORDER BY PcILokale.PcNr";
        ResultSet rs1 = db.sqlQuery(sql1);
       
        String sql2 = "SELECT * FROM Lokale LEFT JOIN PcILokale ON Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr";
        ResultSet rs2 = db.sqlQuery(sql2);
       
        Pc pc;
        Lokale lokale;
        PcILokale pcILokale;
       
        Vector vector = new Vector();
       
        try
        {
            while (rs1.next() && rs2.next())       
            {
                pc = new Pc(rs1.getString("PcNr"), rs1.getString("Beskrivelse"), rs1.getInt("Tilstand"), rs1.getString("FejlBeskrivelse"));
                lokale = new Lokale(rs2.getInt("LokaleNr"), rs2.getString("Beskrivelse"));
                pcILokale = new PcILokale(lokale, pc);
                vector.add(pcILokale);
                db.close();   
            }
        }
        catch(SQLException fejl)
        {
            db.close();
        }
       
        return vector;
    } //public Vector getPcILokaleVector()

-----------------------Udskrift----------------------------

for (int i = 0; i < vector.size(); i++)
{
  pcILokale = (PcILokale)vector.get(i);
  System.out.println("Pc: " + pcILokale.getPc().getPcNr());
  System.out.println("Lokale: " + pcILokale.getLokale 
  ().getLokaleNr());
}
Avatar billede arne_v Ekspert
15. maj 2003 - 20:11 #1
Drop de 2 queries og lav 1 query som joiner alle 3 tabeller.
Avatar billede arne_v Ekspert
15. maj 2003 - 20:12 #2
Så får du kun et ResultSet og kun en .next() i while løkken.
Avatar billede arne_v Ekspert
15. maj 2003 - 20:13 #3
Ja - *OG* så skal db.close() fjernes fra while-løkken !

Det er er nok det som gør at du kun komme rigennem løkken 1 gang !!!!
Avatar billede arne_v Ekspert
15. maj 2003 - 20:14 #4
db.close(9 skal altså flytte snedenfor while løkken.

Og så vil jeg anbefale at du udskriver exception i catch - det
gør trouble-shooting langt nemmere.
Avatar billede hepou Nybegynder
15. maj 2003 - 20:15 #5
Mener du noget i stil med:

String sql1 = "SELECT * FROM Pc LEFT JOIN PcILokale ON Pc.PcNr = PcILokale.PcNr AND Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr";
        ResultSet rs1 = db.sqlQuery(sql1);

Er ikke så hård til sql
Avatar billede arne_v Ekspert
15. maj 2003 - 20:20 #6
Noget i retning af (bare tastet hurtigt ind):

public Vector getPcILokaleVector()
    {
        db.open();
        String sql = "SELECT * FROM Lokale LEFT JOIN (Pc LEFT JOIN PcILokale ON Pc.PcNr = PcILokale.PcNr) Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr"; // <----
        ResultSet rs = db.sqlQuery(sql);
     
        Pc pc;
        Lokale lokale;
        PcILokale pcILokale;
     
        Vector vector = new Vector();
     
        try
        {
            while (rs.next())     
            {
                pc = new Pc(rs.getString("PcNr"), rs.getString("Beskrivelse"), rs.getInt("Tilstand"), rs.getString("FejlBeskrivelse"));
                lokale = new Lokale(rs.getInt("LokaleNr"), rs.getString("Beskrivelse"));
                pcILokale = new PcILokale(lokale, pc);
                vector.add(pcILokale);
            }
            db.close(); // <-----
        }
        catch(SQLException fejl)
        {
            System.err.println(fejl); // <-----
            db.close();
        }
     
        return vector;
    }
Avatar billede arne_v Ekspert
15. maj 2003 - 20:21 #7
Der mangler vist et ON:

      String sql = "SELECT * FROM Lokale LEFT JOIN (Pc LEFT JOIN PcILokale ON Pc.PcNr = PcILokale.PcNr) ON Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr"; // <----
Avatar billede hepou Nybegynder
15. maj 2003 - 20:27 #8
Får en:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access-driver] Joinudtrykket understøttes ikke.
Avatar billede hepou Nybegynder
15. maj 2003 - 20:28 #9
Det første virker, men er måske ikke så kønt. Hvis vi kan får det andet til at køre ville det være kanon lækkert (skal bruges til en datamatiker-eksamen)
Avatar billede arne_v Ekspert
15. maj 2003 - 20:48 #10
Prøv uden LEFT JOIN:

String sql = "SELECT * FROM Lokale,Pc,PcILokale WHERE Pc.PcNr = PcILokale.PcNr
AND Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr"; // <----
Avatar billede hepou Nybegynder
15. maj 2003 - 20:50 #11
Virker ikke helt efter hensigten. Nu udskriver den bare i "alfabetisk" rækkefølge. Det er meningen at den skal hente dem ind i vectoren som de står i databasen (PcILokale-tabellen). Altså at en bestemt pc tilhører et bestemt lokale. Nu tager den den første pc i pc-tabellen og sætter sammen med det første lokale i lokale-tabellen.

Hvorfor gør den det??
Avatar billede arne_v Ekspert
15. maj 2003 - 20:50 #12
Men det er så altså en INNER JOIN og ikke en LEFT JOIN.

Jeg kan dog ikke forstå at LEFT JOIN ikke virker.

Måske:

String sql = "SELECT * FROM (Pc LEFT JOIN PcILokale ON Pc.PcNr = PcILokale.PcNr) LEFT JOIN Lokale ON Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr"; // <----

??
Avatar billede hepou Nybegynder
15. maj 2003 - 20:53 #13
Nu får jeg en:

java.sql.SQLException: No data found
Avatar billede arne_v Ekspert
15. maj 2003 - 21:00 #14
Betyder det ikke bare:

ORDER BY PcILokale.LokaleNr

eller eventuelt:

ORRDER BY PcILokale.LokaleNr,PcILokale.PcNr

?
Avatar billede arne_v Ekspert
15. maj 2003 - 21:02 #15
Den sidste fejl kan jeg ikke helt gennemskue.

Umiddelbart ville jeg da have troet at den var valid SQL.

Kunne i evt. lige poste jeres kode som den ser ud nu ?
Avatar billede hepou Nybegynder
15. maj 2003 - 21:04 #16
public Vector getPcILokaleVector()
    {
        db.open();
        String sql = "SELECT * FROM (Pc LEFT JOIN PcILokale ON Pc.PcNr = PcILokale.PcNr) LEFT JOIN Lokale ON Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr"; // <----
        ResultSet rs = db.sqlQuery(sql);
     
        Pc pc;
        Lokale lokale;
        PcILokale pcILokale;
     
        Vector vector = new Vector();
     
        try
        {
            while (rs.next())     
            {
                pc = new Pc(rs.getString("PcNr"), rs.getString("Beskrivelse"), rs.getInt("Tilstand"), rs.getString("FejlBeskrivelse"));
                lokale = new Lokale(rs.getInt("LokaleNr"), rs.getString("Beskrivelse"));
                pcILokale = new PcILokale(lokale, pc);
                vector.add(pcILokale);
            }
            db.close(); // <-----
        }
        catch(SQLException fejl)
        {
            System.err.println(fejl); // <-----
            db.close();
        }
     
        return vector;
    }
Avatar billede hepou Nybegynder
15. maj 2003 - 21:04 #17
Eller vil du have mere kode end bare metoden??
Avatar billede arne_v Ekspert
15. maj 2003 - 21:27 #18
Nej det er OK.

Jeg forstår det ikke helt.

En tilsvarende query virker fint hos mig, når jeg tester i Access.

JDBC koden ser OK ud.

Og I får:
  java.sql.SQLException: No data found
?
Avatar billede hepou Nybegynder
15. maj 2003 - 21:31 #19
jep. jeg forstår det ikke helt. Jeg får følgende output:

C:\jdk1.3.1_03\bin\java.exe  ReadMain
Working Directory - c:\read-program\
Class Path - .;c:\Kawapro5.0\kawaclasses.zip;c:\jdk1.3.1_03\lib\tools.jar;c:\jdk1.3.1_03\jre\lib\rt.jar;c:\jdk1.3.1_03\jre\lib\i18n.jar;C:\jdk1.3.1_03\packages
java.sql.SQLException: No data found

Process Exit...
Avatar billede arne_v Ekspert
16. maj 2003 - 01:15 #20
Jeg har søgt lidt på nettet og det er formentlig en lille unhensigtsmæssighed
i JDBC ODBC bridgen.

Prøv og erstat:

          while (rs.next())   
            {
                pc = new Pc(rs.getString("PcNr"), rs.getString("Beskrivelse"), rs.getInt("Tilstand"), rs.getString("FejlBeskrivelse"));
                lokale = new Lokale(rs.getInt("LokaleNr"), rs.getString("Beskrivelse"));
                pcILokale = new PcILokale(lokale, pc);
                vector.add(pcILokale);
            }

med:

          while (rs.next())   
            {
                String pcnr = rs.getString("PcNr");
                String beskrivelse = rs.getString("Beskrivelse");
                String tilstand = rs.getInt("Tilstand");
                String fejlbeskrivelse = rs.getString("FejlBeskrivelse");
                String lokalenr = rs.getInt("LokaleNr");
                pc = new Pc(pcnr, beskrvelse, tilstand, fejlbeskrivelse);
                lokale = new Lokale(lokalenr, beskrivelse);
                pcILokale = new PcILokale(lokale, pc);
                vector.add(pcILokale);
            }
Avatar billede arne_v Ekspert
16. maj 2003 - 01:16 #21
Problemet skulle ligge i at hente det samme felt mere end en gang.

I det her tilfælde feltet "Beskrivelse".
Avatar billede hepou Nybegynder
16. maj 2003 - 08:16 #22
Kanon fedt. Tusind tak for hjælpen. Det er sku' stort.

Jeg blev dog nødt til at ændre beskrivelse til henholdsvis lokaleBeskrivelse og pcBeskrivelse. Ellers hentede den kun beskrivelsen på lokale og smed i dem begge, men u virker det.

Tusind tak for hjælpen.

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