Avatar billede kews Nybegynder
15. maj 2002 - 16:18 Der er 5 kommentarer og
1 løsning

Hvordan sender jeg dette objekt over i DBFacade ???

Jeg har et Kunde objekt, som jeg gerne vil have sendt over til min database forbindelse, hvordan undgår jeg at compileren brokker sig :

java:43: non-static method findForbindelse() cannot be referenced from a static context
        DBFacade.findForbindelse();

Følgende er source-koder :

import java.sql.*;

public class DBConnection
{
    //Reference til DBConnection selv, så det sikres at
    //der kun findes én 
    private static DBConnection forbindelse;
    public static Connection dbc;
    private static boolean forbindelsenErLedig = true;
   
   
    //Konstruktøren gemmes, således at modellen bliver en Singleton 
    //og metoden getDBConnection er den eneste måde at tilgå
    //databasen på       
    private DBConnection() {}
 
      public static DBConnection getConnection()
    {   
        if(forbindelsenErLedig)
        {
            if (forbindelse == null)
            {
                forbindelse = new DBConnection();
                System.out.println("Jeg er klar");
               
            }
            forbindelsenErLedig = false;
        }
       
        else
        {
            System.out.println("Forbindelse optaget");
        }
       
        return forbindelse;
    }
   
    public Connection opretConnection()
    {
            //JDBC-forbindelsen til JDBC-ODBC broen oprettes
            try       
            {   
                Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
            }
       
            catch (ClassNotFoundException cnfe)
            {
                System.out.println(cnfe);
            }
   
            //Ovenstående database-driver benyttes til at knytte forbindelsen til MS-ACCESS basen
   
            try
            {
               
                dbc = DriverManager.getConnection("jdbc:odbc:OptikSysDatabase");
           
            }
   
            catch (SQLException sqle)
            {
                System.out.println(sqle);
            }
   
            return dbc;
    }
   
 
}

import java.sql.*;

public class DBFacade
{
    boolean forbindelseOprettet = false;
    DBConnection forbindelse;
    Connection dbc;
    public DBFacade()
    {
        System.out.println("Klar til oprette en forbindelse");
        opretDatabaseForbindelse();
        findForbindelse();
    }
   
    public DBConnection opretDatabaseForbindelse()
    {
        forbindelse = DBConnection.getConnection();
        return forbindelse;
    }
   
    public Connection findForbindelse()
    {
        dbc = DBConnection.opretConnection();
        return dbc;
    }
       
    //SQL metoder
    public void opretKunde(Kunde nyKunde)            //skal modtage object
    {
        int kundenr  = 0;
        int postnr  = 0;
        int tlfnr    = 0;
        String fnavn = "";
        String enavn = "";
        String gade  = "";
        String husnr = "";
       
            try
            {
                Statement statement = dbc.createStatement();
               
                kundenr = getMaxId() + 1;
                postnr     = nyKunde.getPostnr();
                tlfnr     = nyKunde.getTlf();
                fnavn     = nyKunde.getFornavn();
                enavn     = nyKunde.getEfternavn();
                gade     = nyKunde.getGade();
                husnr     = nyKunde.getHusnr();
               
                String insertKunde = "INSERT INTO KUNDE ( kundenr, fornavn, efternavn, gade, husnr, postnr) VALUES ("+kundenr+", '"+fnavn+"', '"+enavn+"','"+gade+"','"+husnr+"',"+postnr+");";
                String insertTlf = "INSERT INTO tlf VALUES ("+tlfnr+","+kundenr+");";
       
                statement.executeUpdate(insertKunde);
                statement.executeUpdate(insertTlf);
                statement.close();
            }
           
            catch (SQLException sqle)
            {
            }
    }
   
    public void sletKunde(int i)            //skal modtage kundenr
    {
       
        try
        {
            Statement deleteStmt = dbc.createStatement();
           
            String sletKunde = "DELETE * FROM kunde WHERE kundenr="+i+";";
           
            deleteStmt.executeUpdate(sletKunde);
            deleteStmt.close();       
        }
       
        catch (SQLException sqle)
        {
        }
           
    }
   
    public ResultSet visMedlem(int i)    throws SQLException        //ind parameter telefonnr, ud resultset
    {
       
       

        String SQLvis = "SELECT kunde.kundenr, fornavn, efternavn, gade, husnr, kunde.postnr, postby.by, tlfnr, fødselsdag"
                        + "FROM kunde, postby, tlf"
                      + "WHERE kunde.postnr=postby.postnr And kunde.kundenr=tlf.kundenr"
                      + "AND tlf.tlfnr = "+i+";";
                 
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(SQLvis);
        stmt.close();
        return rs;
    }
   
       
    public ResultSet synsPrøveRes(int i) throws SQLException
    {
       
        String sql = "SELECT dato, højre, venstre FROM synsprøve WHERE synsprøvenr = "+i+";";
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        stmt.close();
        return rs;
    }

   
    //int i = synsprøvenr!
    //ordre laves om til arraylist??

/*    public void nyOrdre(int i, Ordre nyOrdre)        //skal modtage ordre object
    {
       
        int ordrenr            = 0;
        int synsprøvenr     = i;
        String dato          = "";
        String antal         = "";
        String pris            = "";
        String varenr         = "";
        String vare         = "";
       
   
        try
        {
            Statement stmt = dbc.createStatement();
           
   
            dato         = nyOrdre.getDato();            //hvad er dato??
            varenr         = nyOrdre.getVarenr();
            vare         = nyOrdre.getVare();
            antal         = nyOrdre.getAntal();
            pris        = nyOrdre.getPris();
           
            Integer.parseInt(antal);            //skal ligges i util klasse
            Double.parseDouble(pris);            //skal ligges i util klasse
            ordrenr = getMaxOrdre();
           
           
            String insertOrdre = "INSERT INTO KUNDE (ordrenr, synsprøvenr, dato)"
                              + "VALUES ( "+ordrenr+", "+synsprøvenr+", #"+dato+"#);";
           
            String insertVareordre = "INSERT INTO VAREORDRE (ordrenr, varenr, vare, antal, pris) VALUES ("+ordrenr+", '"+varenr+"','"+vare+"',"+antal+", "+pris+");";
   
            stmt.executeUpdate(insertOrdre);
            stmt.executeUpdate(insertVareordre);
            stmt.close();       
        }
       
        catch (SQLException sqle)
        {
       
        }
       
    }*/
   
    //i = kundenr, j = synsprøvenr

    public ResultSet visOrdre(int i, int j) throws SQLException
    {
       
        String sql = "SELECT kunde.kundenr, kunde.fornavn, kunde.efternavn, kunde.gade, kunde.husnr,"
                  + "kunde.postnr, kunde.fødselsdag, synsprøve.synsprøvenr, ordre.ordrenr, ordre.dato,"
                  + "FROM kunde, synsprøve, ordre"
                  + "WHERE kunde.kundenr="+i+""
                  + "AND ordre.ordrenr=vareordre.ordrenr"
                  + "AND kunde.kundenr=synsprøve.kundenr"
                  + "AND synsprøve.synsprøvenr=ordre.synsprøvenr"
                  + "AND ordre.synsprøvenr = "+j+";";
       
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        stmt.close();
        return rs;
    }
   
    // i = ordrenr
    public ResultSet visVareOrdre(int i) throws SQLException
    {
        String sql = "SELECT vareordre.varenr, vareordre.vare, vareordre.antal, vareordre.pris"
                  + "FROM vareordre"   
                  + "WHERE vareordre.ordrenr = "+i+";";
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        stmt.close();
        return rs;
    }
   
    //SQL hjælpemetoder
    public int getMaxId() throws SQLException
    {
        String sql = "SELECT Max (kundenr) AS maxid FROM kunde;";
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        rs.next();
        int max = rs.getInt("maxid");
        stmt.close();
        return max;
    }
   
    public int getMaxOrdre() throws SQLException
    {
        String sql = "SELECT Max (ordrenr) AS maxordre FROM ordre;";
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        rs.next();
        int max = rs.getInt("maxordre");
        stmt.close();
        return max;
    }
   
    //metode der finder sidste synsprøve fra kunde
    public int maxSynsprøveOnKunde(int i) throws SQLException  //skal modtage kundenr
    {
       
        String sql = "SELECT Max (synsprøvenr) AS maxid FROM kunde WHERE kundenr = "+i+";";
        Statement stmt = dbc.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        rs.next();
        int max = rs.getInt("maxid");
        stmt.close();
        return max;
    }
   

}

import java.lang.Object;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.Action;
import javax.swing.AbstractAction;
import java.sql.*;
import java.lang.*;
import java.util.*;

public class opretKundeFrameController implements ActionListener
{
   
    public opretKundeFrameController(opretKundeFrame okf)
    {
        this.okf = okf;
    }
   
        public void actionPerformed(ActionEvent e)
        {
       
        int nytKundenr = 0;
       
        nytKundenr    = Integer.parseInt(okf.kundenr.getText());
        fornavn    = okf.fornavn.getText();
        efternavn  = okf.efternavn.getText();
        gade        = okf.gade.getText();
        husnr      = okf.husnr.getText();
        postnr      = Integer.parseInt(okf.postnr.getText());
        tlf        = Integer.parseInt(okf.tlf.getText());
        //String indsaetFoedselsdag = foedselsdag.getText();
       
        Kunde indsaetKunde = new Kunde(kundenr, fornavn, efternavn, gade, husnr, postnr, tlf);
       
        System.out.println("Kunde-objekt oprettet");
       
        DBFacade.opretKunde(indsaetKunde);
       
    }
   
    private opretKundeFrame okf;   
    private int kundenr;
    private String fornavn;
    private String efternavn;
    private String gade;
    private String husnr;
    private int postnr;
    private int tlf;
}
Avatar billede disky Nybegynder
15. maj 2002 - 17:28 #1
et eller andet sted kalder du en non static metode fra et static sted. Og det må man ikke.

Forresten dit singleton pattern er MEGET farligt at bruge, da det ikke er sikret imod brug fra flere tråde.
Avatar billede soelvpil Nybegynder
15. maj 2002 - 18:44 #2
Du kalder findForbindele metoden, på KLASSEN DBfacace, i stedet for på et objekt af klassen. Du har to muligheder

1. Lav et DBFAcade objekt.

DBFacade facade = new DBFacade();
Connection conn = facade.findForbindelse();

2. Alternativt kan du ændre DBFacaden , så alle metoder og felter er static
Avatar billede kews Nybegynder
15. maj 2002 - 19:19 #3
disky -> hvordan sikrer jeg det mod brug fra flere tråde ?
Avatar billede soelvpil Nybegynder
15. maj 2002 - 19:55 #4
Jeg vil foreslå, at du gør dine opret- og find-forbindelse metoder private, disse må IKKE kaldes udefra.

Mange af de øvrige metoder ligner hjælpe-metoder, disse bør også være private.

I dn findForbindelse() metode er der en reference til DBConnecion-klassen, denne skal vist rettes til forbindelse-objektet?

Sikringen mod flere tråde, opnås ved at synkronisere "forretningsmetoderne", nyOrdre, opretKunde sletKunde, f.eks. ved at ændre signaturen til

public synchronized void nyOrdre(int i, Ordre nyOrdre)

og tilsvarende for de andre. Dette sikrer, at der kun er en tråd, der kan tilgå disse metoder og dermed databasen ad gangen.
Avatar billede disky Nybegynder
15. maj 2002 - 20:08 #5
skal det laves rigtigt godt skal du bruge en connection pool.
Avatar billede soelvpil Nybegynder
15. maj 2002 - 21:47 #6
Men access har det vist ikke så godt med flere samtidige brugere, så det er vel ikke relevant her??
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