Avatar billede ozman Nybegynder
13. april 2004 - 11:59 Der er 18 kommentarer og
1 løsning

Java og access databse

Jeg sidder og roder med noget database tingang men kan ikke få det til at virke. Hvis jeg bare skulle lave en simpel gui med en main klasse, der kunne hive noget data ud af en database (f.eks.) kundenavne i en kundedatase, hvordan kunne det så se ud. Jeg bruger som sagt en access database.
Avatar billede arne_v Ekspert
13. april 2004 - 13:01 #1
Hvor er du kørt fast henne ?
Avatar billede _carsten Nybegynder
13. april 2004 - 13:36 #2
Prøv nedenstående, det er kastet sammen med en skovl, ville dog mene at det virkede.
Om ikke andet, kan det måske bringe dig videre, eller foranledige spørgsmål.


import java.sql.*;
public class DBaccess extends javax.swing.JFrame {
   
    public DBaccess() {
        initComponents();
        setSize(650, 550);
    }

    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        jEditorPane1 = new javax.swing.JEditorPane();
        jButton2 = new javax.swing.JButton();
        jLabel4 = new javax.swing.JLabel();
        jTextField3 = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jLabel5 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.GridBagLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jLabel1.setText("Username:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        getContentPane().add(jLabel1, gridBagConstraints);

        jLabel2.setText("Password:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH;
        getContentPane().add(jLabel2, gridBagConstraints);

        jTextField1.setColumns(10);
        jTextField1.setPreferredSize(new java.awt.Dimension(60, 20));
        jTextField1.setMinimumSize(new java.awt.Dimension(60, 20));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 0.01;
        getContentPane().add(jTextField1, gridBagConstraints);

        jTextField2.setColumns(10);
        jTextField2.setPreferredSize(new java.awt.Dimension(60, 20));
        jTextField2.setMinimumSize(new java.awt.Dimension(60, 20));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH;
        gridBagConstraints.weightx = 0.01;
        getContentPane().add(jTextField2, gridBagConstraints);

        jButton1.setText("Connect");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 40, 0, 0);
        getContentPane().add(jButton1, gridBagConstraints);

        jLabel3.setText("Skriv SQL statement");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0);
        getContentPane().add(jLabel3, gridBagConstraints);

        jEditorPane1.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.LOWERED));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.gridheight = 4;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.01;
        gridBagConstraints.weighty = 0.01;
        getContentPane().add(jEditorPane1, gridBagConstraints);

        jButton2.setText("Execute SQL");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 0);
        getContentPane().add(jButton2, gridBagConstraints);

        jLabel4.setText("Sti til DB");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(0, 15, 0, 0);
        getContentPane().add(jLabel4, gridBagConstraints);

        jTextField3.setColumns(20);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        getContentPane().add(jTextField3, gridBagConstraints);

        jScrollPane1.setViewportView(jTextArea1);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 8;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.gridheight = 5;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.01;
        gridBagConstraints.weighty = 0.03;
        getContentPane().add(jScrollPane1, gridBagConstraints);

        jLabel5.setText("Result");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
        getContentPane().add(jLabel5, gridBagConstraints);

        pack();
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        ResultSet rs = null;
        try{
            Statement stmt = con.createStatement();
            rs = stmt.executeQuery(jEditorPane1.getText());
            con.commit();
           
            ResultSetMetaData data = rs.getMetaData();
            int columns = data.getColumnCount();
            rs.last();
            int rows = rs.getRow();
            rs.first();
            StringBuffer buf = new StringBuffer();
           
            buf.append("Result from query\n\n");
           
            for(int x =0; x < rows; x++){
                for(int i =0; i < columns; i++){
                    buf.append(rs.getObject(i).toString() + "\t");
                }
                buf.append("\n");
            }
           
            jTextArea1.setText(buf.toString());
        }
        catch(SQLException fejl){
            fejl.printStackTrace();
        }

    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        try
        {
            con = DriverManager.getConnection("jdbc:odbc:" + jTextField3.getText(),
                                    jTextField1.getText(), jTextField2.getText());
            con.setAutoCommit(true);
        }
        catch (java.lang.Exception fejl)
        {
            fejl.printStackTrace();
        }   
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        try{
            con.close();
        }
        catch (SQLException fejl){
            System.exit(0);
        }
       
        System.exit(0);
    }

    public static void main(String args[]) {
        new DBaccess().show();
    }
   
    private Connection con;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JEditorPane jEditorPane1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField3;
}
Avatar billede ozman Nybegynder
13. april 2004 - 14:56 #3
Arne V:
Jeg har fået lavet gui og har kigget på en masse eksempler på forbindelse mellem java og access, men kan ikke rigtig finde hoved og hale i det. Det jeg har er en main klasse der starter gui'en. I guien kan brugeren skrive et kundenavn, hvorefter alle ordre lavet af denne kunde skulle kunne vises i textarea eller ligende. Det jeg ikke kan få til at virke er at få databasen til at retunere noget ud fra den select sætning jeg har genereret.
Kort og godt.--> Bruger indtaster kundernavn og trykker på "søg" knap ---> en select sætning bliver genereret ud fra det indtastede ---> select sætningen bliver sendt til databasen, men den sender ikke noget igen.:-(

Carsten: Pyyha...tak skal du ha, jeg skal lige se om jeg kan finde hoved og hale i det:-)
Avatar billede _carsten Nybegynder
13. april 2004 - 15:00 #4
:-)
Avatar billede arne_v Ekspert
13. april 2004 - 15:15 #5
Noget a la:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:DinDSN");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM dintabel WHERE kunde='" + kundeTextBox.getText()+"'");
while(rs.next()) {
  int ifelt = rs.getInt(1); // kolonne 1 er en integer
  String sfelt = rs.getString(2); // kolonne 2 er en string
  // vis ifelt og sfelt på en eller anden måde i GUI
}
Avatar billede ozman Nybegynder
14. april 2004 - 14:01 #6
Arne..du må hjælpe mig... Hvad skal stå i main klassen og hvad skal stå i gui klassen og hvor jeg kan slet ikke få det til at virke:-(
Avatar billede arne_v Ekspert
14. april 2004 - 14:18 #7
Det er jo det Carstens eksempel gør !
Avatar billede arne_v Ekspert
14. april 2004 - 14:19 #8
Et lidt simplere eksempel:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class SimpleDBGUI extends JFrame implements ActionListener {
    private JButton find;
    private JTextField kunde;
    private JTextArea res;
    public SimpleDBGUI() {
        getContentPane().setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        kunde = new JTextField();
        getContentPane().add(kunde, BorderLayout.NORTH);
        res = new JTextArea();
        getContentPane().add(res, BorderLayout.CENTER);
        find = new JButton("Søg");
        find.addActionListener(this);
        getContentPane().add(find, BorderLayout.SOUTH);
    }
    public void actionPerformed(ActionEvent evt) {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection("jdbc:odbc:dindsn");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM tabelnavn WHERE kundefelt='" + kunde.getText() + "'");
            while (rs.next()) {
                int ifelt = rs.getInt(1);
                String sfelt = rs.getString(2);
                res.setText(res.getText() + ifelt + " " + sfelt + "\r\n");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        SimpleDBGUI f = new SimpleDBGUI();
        f.show();
    }
}
Avatar billede ozman Nybegynder
14. april 2004 - 21:54 #9
oki det lader til at jeg har fået forbindelse, men den vil ikke retunere noget. Den bliver ved med at skrive følgende fejl besked.?!?!?!?

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Invalid character value for cast specification on column number 1 (kundenavn)
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
        at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(JdbcOdbc.java:3812)
        at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(JdbcOdbcResultSet.java:5642)
        at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:585)
        at G2Gui.actionPerformed(G2Gui.java:139)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
        at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
        at java.awt.Component.processMouseEvent(Component.java:5100)
        at java.awt.Component.processEvent(Component.java:4897)
        at java.awt.Container.processEvent(Container.java:1569)
        at java.awt.Component.dispatchEventImpl(Component.java:3615)
        at java.awt.Container.dispatchEventImpl(Container.java:1627)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
        at java.awt.Container.dispatchEventImpl(Container.java:1613)
        at java.awt.Window.dispatchEventImpl(Window.java:1606)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Avatar billede arne_v Ekspert
14. april 2004 - 21:59 #10
Du skal huske at bruge getInt og getString alt efter hvilken data type
felterne er i databasen.

Da jeg ikke kender din database struktur lod jeg bare første felt være int og
andet felt være String.

Det skal du lige rette til.
Avatar billede ozman Nybegynder
15. april 2004 - 14:03 #11
Den er god' fin. Det virker. TAK. Skal du lige ha point
Avatar billede arne_v Ekspert
15. april 2004 - 14:05 #12
Så vil jeg ligge et svar
Avatar billede ozman Nybegynder
18. april 2004 - 12:00 #13
Nu ved jeg godt at der er lagt svar, men jeg har lige en lille ting til. Hvis nu jeg gerne vil samle alle mine database forespørgsler i en database-tilgangs klasse, hvor der er forskellige metoder til forskellige forespørgsler hvordan får jeg så metoden til at retunere svarene fra databasen til gui-klassen? Hvis du ellers forstår hvad jeg mener:-)
Avatar billede arne_v Ekspert
18. april 2004 - 12:08 #14
Umiddelbart kan jeg se mindst 2 muligheder:

1)  Dine forespørgsels metoder returnerer det rå ResultSet og GUI kode
    kalder så next() og getXxx()

2)  Dine forespørgsels metoder kopierer result settet over i en ArrayList
    af objekter (beans)

Det sidst er nok det pæneste, men kræver nok også lidt mere kode.
Avatar billede ozman Nybegynder
18. april 2004 - 12:10 #15
hmm...nu er jeg ikke overhovedet bekendt med beans. Jeg har også hørt noget om at man kunne bruge noget der hedder vectorer... er det muligt i denne situation?
Avatar billede arne_v Ekspert
18. april 2004 - 12:12 #16
Vector og ArrayList er stort set ens. Så ja.
Avatar billede arne_v Ekspert
18. april 2004 - 12:13 #17
Beans er bare klasser med nogle private variable med public get og set
(og en constructor uden argumenter).
Avatar billede ozman Nybegynder
19. april 2004 - 13:20 #18
:-( Jeg kan simpelthen ikke få det til at virke.. Er du ikke en guttermand og smide en simpelt eksempel ud, på hvordan det kunne se ud.:-) Som sagt så virker det fint fra min actionlistner metode, men jeg vi gerne ha det samlet i en database klasse.
Avatar billede arne_v Ekspert
19. april 2004 - 20:55 #19
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.sql.*;

public class SimpleDBGUI extends JFrame implements ActionListener {
    private JButton find;
    private JTextField crit;
    private JTextArea res;
    private DBHandler db;
    public SimpleDBGUI() {
        getContentPane().setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        crit = new JTextField();
        getContentPane().add(crit, BorderLayout.NORTH);
        res = new JTextArea();
        getContentPane().add(res, BorderLayout.CENTER);
        find = new JButton("Søg");
        find.addActionListener(this);
        getContentPane().add(find, BorderLayout.SOUTH);
        db = new DBHandler("TestMSAccess", "Admin", "");
    }
    public void actionPerformed(ActionEvent evt) {
        res.setText("");
        ArrayList lst = db.getAll(crit.getText());
        for(int i = 0; i < lst.size(); i++) {
            res.setText(res.getText() + lst.get(i) + "\r\n");
        }
    }
    public static void main(String[] args) {
        SimpleDBGUI f = new SimpleDBGUI();
        f.show();
    }
}

class DBHandler {
    private Connection con;
    private Statement stmt;
    public DBHandler(String dsn, String usr, String pwd) {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection("jdbc:odbc:" + dsn, usr, pwd);
            stmt = con.createStatement();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public ArrayList getAll(String crit) {
        ArrayList res = new ArrayList();
        try {
            ResultSet rs = stmt.executeQuery("SELECT * FROM t1 WHERE f2 LIKE '" + crit + "'");
            while (rs.next()) {
                res.add(new Record(rs.getInt(1), rs.getString(2)));
            }
            rs.close();       
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return res;
    }
}

class Record {
    private int f1;
    private String f2;
    public Record() {
        f1 = 0;
        f2 = "";
    }
    public Record(int f1, String f2) {
        this.f1 = f1;
        this.f2 = f2;
    }
    public int getF1() {
        return f1;
    }
    public String getF2() {
        return f2;
    }
    public void setF1(int f1) {
        this.f1 = f1;
    }
    public void setF2(String f2) {
        this.f2 = f2;
    }
    public String toString() {
        return (f1 + " " + f2);
    }
}
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