Avatar billede trp79 Nybegynder
05. maj 2002 - 19:32 Der 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);

        if(rod==null)
        {
            rod=nyt;            //indsaet_rod()
        }
        else if(aktuel.v.efternavn.compareTo(nyt.v.efternavn)>=0)    //indsaet_vson()
        {
            if(aktuel.v_son==null)
            {
                aktuel.v_son=nyt;
            }
            else
            {
                indsaet(aktuel.v_son,vv);
            }
        }
        else if(aktuel.v.efternavn.compareTo(nyt.v.efternavn)<0)    //indsaet_hson()
        {
            if(aktuel.h_son==null)
            {
                aktuel.h_son=nyt;
            }
            else
            {
                indsaet(aktuel.h_son,vv);
            }
        }
    }
   
public void gemDB()        //gemmer det binære træ på 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
            st.executeUpdate("CREATE TABLE btrae (id INTEGER NOT NULL, fornavn VARCHAR(80), efternavn VARCHAR(80), adr VARCHAR(80), nr VARCHAR(80), postnr VARCHAR(80),by VARCHAR(80),fastnet VARCHAR(80),mobil VARCHAR(80),email VARCHAR(80),farid INTEGER)");

            gemDB(st, rod, 1);    //kalder den rekursive gemDB-metode med
                                //sætningsobjektet, roden og primærnøglen 1

            st.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    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

            rod= hentDB(st, 1, null);

            st.executeUpdate("DROP TABLE btrae");
            st.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    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

                e.far= far;                        //e's far-reference sættes

                e.v_son= hentDB(st, id*2, e);         //opret venstre undertræ

                e.h_son= hentDB(st, id*2+1, e);     //opret højre undertræ
            }
        }
        catch(Exception ex)
        {
            System.out.println(ex);
        }

        return e;
    }


Avatar billede disky Nybegynder
05. maj 2002 - 19:34 #1
hvad er det som går galt ?
Avatar billede trp79 Nybegynder
05. maj 2002 - 19:37 #2
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æ).
Avatar billede disky Nybegynder
05. maj 2002 - 19:43 #3
den exception hvilken linie kommer den i ?
Avatar billede trp79 Nybegynder
05. maj 2002 - 19:48 #4
Det står der ikke! Det er lidt underligt, men den får i hvert fald ikke læst dataerne fra databasen, for jeg kan ikke udskrive det binære træ...
Avatar billede trp79 Nybegynder
05. maj 2002 - 19:50 #5
Er sikker på det er i "private Element hentDB(Statement st, int id, Element far)" fejlen er...
Avatar billede disky Nybegynder
05. maj 2002 - 19:50 #6
siden du ved der kommer en NullPointerException har du en try/catch, i den skriv

ex.printStackTrace() så kan du se linie nummeret, og derefter fortælle mig hvilken linie det er.

p.s. det er ikke pæn kode bare at Catche 'Exception' catch specifik dem der kan opstå
Avatar billede disky Nybegynder
05. maj 2002 - 19:54 #7
okay, så undersøg om sit Statement du overfører er 'null'
Avatar billede trp79 Nybegynder
05. maj 2002 - 19:56 #8
ResultSet rs= st.executeQuery("SELECT * FROM btrae WHERE id="+ id);
Avatar billede trp79 Nybegynder
05. maj 2002 - 19:56 #9
i den metode jeg omtalte...
Avatar billede disky Nybegynder
05. maj 2002 - 19:58 #10
det eneste der der kan lave den exception er at din 'st' variable er null.
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:06 #11
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)"
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:07 #12
Det må du altså undskylde, klokkede i det før!
Avatar billede disky Nybegynder
05. maj 2002 - 20:12 #13
Det er bare helt okay :9

I din kode foroven har du Æ

                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.
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:20 #14
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:
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:25 #15
Jeg har plukket lidt ud, men kun nogle metoder som ikke bruges til hent....

import java.sql.*;
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


        {

            v= vV;
        }
    }


    Element rod, aktuel;

    void indsaet(Element e, Person vv)
    {
        aktuel=e;
        Element nyt = new Element(vv);

        if(rod==null)
        {
            rod=nyt;            //indsaet_rod()
        }
        else if(aktuel.v.efternavn.compareTo(nyt.v.efternavn)>=0)    //indsaet_vson()
        {
            if(aktuel.v_son==null)
            {
                aktuel.v_son=nyt;
            }
            else
            {
                indsaet(aktuel.v_son,vv);
            }
        }
        else if(aktuel.v.efternavn.compareTo(nyt.v.efternavn)<0)    //indsaet_hson()
        {
            if(aktuel.h_son==null)
            {
                aktuel.h_son=nyt;
            }
            else
            {
                indsaet(aktuel.h_son,vv);
            }
        }
    }
//persistens - gem og hent på database
    /****************************************/

    public void gemDB()        //gemmer det binære træ på 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
            st.executeUpdate("CREATE TABLE btrae (id INTEGER NOT NULL, fornavn VARCHAR(80), efternavn VARCHAR(80), adr VARCHAR(80), nr VARCHAR(80), postnr VARCHAR(80),by VARCHAR(80),fastnet VARCHAR(80),mobil VARCHAR(80),email VARCHAR(80),farid INTEGER)");

            gemDB(st, rod, 1);    //kalder den rekursive gemDB-metode med
                                //sætningsobjektet, roden og primærnøglen 1

            st.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    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

            rod= hentDB(st, 1, null);

            st.executeUpdate("DROP TABLE btrae");
            st.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    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

                e.far= far;                        //e's far-reference sættes

                e.v_son= hentDB(st, id*2, e);         //opret venstre undertræ

                e.h_son= hentDB(st, id*2+1, e);     //opret højre undertræ
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            System.out.println(ex);
        }

        return e;
    }


void udskriv(Element e)
    {
    System.out.println(e.v.fornavn+ " " + e.v.efternavn);
    System.out.println(e.v.adr + " " + e.v.nr);
    System.out.println(e.v.postnr + " " + e.v.by);
    System.out.println(e.v.fastnet);
    System.out.println(e.v.mobil);
    System.out.println(e.v.email);
    System.out.println();
    }
}
Avatar billede disky Nybegynder
05. maj 2002 - 20:28 #16
prøv at tilføj en

public Element()
{
}

i din element inner class.
Avatar billede disky Nybegynder
05. maj 2002 - 20:34 #17
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.
Avatar billede disky Nybegynder
05. maj 2002 - 20:35 #18
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.
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:37 #19
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)
Avatar billede disky Nybegynder
05. maj 2002 - 20:40 #20
ud fra din Create Tabel query kan jeg se du ikke har en kolonne der hedder 's' men den forsøger du at hente med getString("s")
derfor går det galt.
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:41 #21
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å?
Avatar billede disky Nybegynder
05. maj 2002 - 20:47 #22
hvis du vil have fat i fornavn som er defineret i basen som en varchar altså en string skriver du:
rs.getString("fornavn");

Hvis det var en int skriver du

rs.getInt("farid");

osv.
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:50 #23
Men de skal vel ind i mit person objekt igen (og detved i træet), og det kan de vel ikke komme uden at man henter en record adgang og sætter dem ind?
Avatar billede trp79 Nybegynder
05. maj 2002 - 20:51 #24
sådan hardcordes en person etc: bt.indsaet(bt.rod,new Person("Per","Hansen","Svinget","21","7560","Hjerm","97979797","23232323","per@svinget.dk"));
Avatar billede disky Nybegynder
05. maj 2002 - 20:55 #25
problemmet er denne linie:
e.s= rs.getString("s");    //med data fra resultatsættet

Den giver ingen mening da du forsøger at hente en kolonne med navnet 's' fra tabellen i basen, og der findes ingen kolonne med navnet 's'.

Du skal hente alle kolonner fra tabellen enkeltvis og indsætte dem i dit person objekt igen
Avatar billede trp79 Nybegynder
05. maj 2002 - 21:03 #26
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");
Avatar billede trp79 Nybegynder
05. maj 2002 - 21:04 #27
ups, så ikke lige det du skrev med enkeltvis... men vil det sige at jeg kan kalde e.s=rs.getString flere gange eller?
Avatar billede disky Nybegynder
05. maj 2002 - 21:08 #28
yep en gang for hvad gang du vil hente indholdet af en kolonne som indeholder en String
Avatar billede trp79 Nybegynder
05. maj 2002 - 21:14 #29
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");
Avatar billede disky Nybegynder
05. maj 2002 - 21:19 #30
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:

e.setFornavn(rs.getString("fornavn"));
e.setEfternavn(rs.getString("efternavn"));

osv.
Avatar billede trp79 Nybegynder
05. maj 2002 - 21:39 #31
Den er jeg ikke lige helt med på :-/ Men kigger videre på det imorgen med friske øjn. Atter engang tak for hjælpen
Avatar billede disky Nybegynder
05. maj 2002 - 22:04 #32
det var så lidt
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