15. maj 2003 - 19:51Der 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(); }
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);
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(); }
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"; // <----
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)
String sql = "SELECT * FROM Lokale,Pc,PcILokale WHERE Pc.PcNr = PcILokale.PcNr AND Lokale.LokaleNr = PcILokale.LokaleNr ORDER BY PcILokale.PcNr"; // <----
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.
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"; // <----
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(); }
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
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); }
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.
:)
Synes godt om
Ny brugerNybegynder
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.