05. maj 2002 - 19:32Der er
31 kommentarer og 1 løsning
Database -> binært-træ
Hej med jer... Jeg sidder og kæmper med hente data over i et binært-træ fra en acces database. Jeg har fået den til at gemme i databasen, men kan ikke få den til at hente data fra databasen og ligge det ind i det binære træ som person objekter. Jeg har altså tre klasser:Person, binaertTrae og Start Jeg har vedlagt en del af koden, håber i kan hjælpe :o)
public class BinaertTrae { class Element { String s; //den gemte værdi
Element v_son; //reference til v. søn Element h_son; //reference til h. søn Element far; //reference til far Person v;
Element(String s) { this.s=s; }
public Element(Person vV)//konstruktør, sætter attributten "v" //til det modtagne Personobjekt (som består af 9 strenge)
{
v= vV; } }
Element rod, aktuel;
void indsaet(Element e, Person vv) { aktuel=e; Element nyt = new Element(vv);
private void gemDB(Statement st, Element e, int id) //gemmer træet i inorder-rækkefølge { if (e!=null) { try { st.executeUpdate("INSERT INTO btrae VALUES ('"+id+"','"+e.v.fornavn+"','"+e.v.efternavn+"','"+e.v.adr+"','"+e.v.nr+"','"+e.v.postnr+"','"+e.v.by+"','"+e.v.fastnet+"','"+e.v.mobil+"','"+e.v.email+"','"+id/2+"')");
gemDB(st, e.v_son, id*2); //indsæt v. undertræ gemDB(st, e.h_son, id*2+1); //indsæt h. undertræ } catch(Exception ex) { System.out.println(ex); } } }
public void hentDB() //henter det binære træ fra databasen "TestDB" { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //load driveren Connection con= DriverManager.getConnection("jdbc:odbc:TestDBbin"); //opret forbindelse Statement st= con.createStatement(); //opret sætningsobject
private Element hentDB(Statement st, int id, Element far) { Element e= null;
try { ResultSet rs= st.executeQuery("SELECT * FROM btrae WHERE id="+ id);
if (rs.next()) //hvis der er noget i tabellen { e= new Element()); //opret rodelementet i undertræet e.s= rs.getString("s"); //med data fra resultatsættet
ups, sorry..glemte at sige det... jeg får en java.lang.NullPointerExpection når jeg prøver at køre programmet(og derved indlæse data fra databasen til det binære træ).
ups, jeg lavede en kæmpe brøler! compilerede den forkerte version, sorry! Jeg får fejlen:
C:\Documents and Settings\Torben Pedersen\My Documents\Dokumenter\DØK\data\Java\progs\Binærtræ\BinaertTrae.java:342: cannot resolve symbol symbol : constructor Element () location: class BinaertTrae.Element e= new Element(); //opret rodelementet i undertræet ^ 1 error
Tool completed with exit code 1
e=new element ligger i "private Element hentDB(Statement st, int id, Element far)"
e= new Element()); //opret rodelementet i undertræet
der er en ) for meget
Lidt mystisk ellers, da en inner class vist nok skulle have en default constructor ligemeget hvad du gør men prøv at tilføj en default constructor med () som parameter.
Nu siger du Æ men mener vel ":" Det var mig der var lidt for hurtig på taster med den dersens ), så det var derfor der var to... du får lige hele klassen som den ser ud nu:
private void gemDB(Statement st, Element e, int id) //gemmer træet i inorder-rækkefølge { if (e!=null) { try { st.executeUpdate("INSERT INTO btrae VALUES ('"+id+"','"+e.v.fornavn+"','"+e.v.efternavn+"','"+e.v.adr+"','"+e.v.nr+"','"+e.v.postnr+"','"+e.v.by+"','"+e.v.fastnet+"','"+e.v.mobil+"','"+e.v.email+"','"+id/2+"')");
gemDB(st, e.v_son, id*2); //indsæt v. undertræ gemDB(st, e.h_son, id*2+1); //indsæt h. undertræ } catch(Exception ex) { System.out.println(ex); } } }
public void hentDB() //henter det binære træ fra databasen "TestDB" { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //load driveren Connection con= DriverManager.getConnection("jdbc:odbc:TestDBbin"); //opret forbindelse Statement st= con.createStatement(); //opret sætningsobject
private Element hentDB(Statement st, int id, Element far) { Element e= null;
try { ResultSet rs= st.executeQuery("SELECT * FROM btrae WHERE id="+ id);
if (rs.next()) //hvis der er noget i tabellen { e= new Element(); //opret rodelementet i undertræet e.s= rs.getString("s"); //med data fra resultatsættet
Denne her kan nok hjælpe lidt, taget fra noget sun dokumentation:
An inner class never has a no-arg constructor, as the compuler transforms all inner class constructors to take a parameter that is a reference to the enclosing object.
Så du SKAL selv lave en no argument konstruktor, som så på compile time, bliver lavet om til en med en reference til super klassen, men det betyder ikke noget i dit tilfælde.
Denn kom lidt længere... nu skriver den: java.sql.SQLExeption:Column not found at sun.jdbc.odbc.JdbcOdbcResultset.findColumn(JdbcResultSet.java:1790) at sun.jdbc.odbc.JdbcOdbcResultset.getString(JdbcResultSet.java:383) at BinaertTrae.hentDB(BinaertTrae.java.348) at BinaertTrae.hentDB(BinaertTrae.java.326) at Start.main(Start.java:23)
348: e.s= rs.getString("s"); //med data fra resultatsættet Men det er vel fordi jeg skal hente dataerne fra recordsne i databasen som hedder henholdsvis fornavn, efternavn osv. men hvordan gøre det så?
Du får mange tak:o) Men hvis jeg nu skal hente dem ind, hvordan gør jeg så det? Jeg kan jo ikke bare læse det som en lang streng som fx: e.s= rs.getString("fornavn","efternavn","adr","nr","postnr","by","fastnet","mobil","email");
Det funker bare ikke.... på denne måde, er det helt forkert?(alle ER strenge): e= new Element(); //opret rodelementet i undertræet e.s= rs.getString("fornavn"); //med data fra resultatsættet e.s= rs.getString("efternavn"); e.s= rs.getString("adr"); e.s= rs.getString("nr"); e.s= rs.getString("postnr"); e.s= rs.getString("by"); e.s= rs.getString("fastnet"); e.s= rs.getString("mobil"); e.s= rs.getString("email");
I din element klasse har du en variable af typen person, jeg gætter på det er inde i den du ønsker data, det ville måske være fornuftigt at oprette et objekt af typen i din element() constructor, så laver du en setFornavn(), setEfternavn() osv metode for alle atributter som en person kan have så gør du bagefter:
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.