# Datenbankverbindung Access



## mimix (6. Jun 2012)

Hallo

Ich möchte ein Verbindung zu meiner Access Datenbank herstellen


```
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;


public class JTableExample extends JFrame {

   private static final String dbDriverClass = "sun.jdbc.odbc.JdbcOdbcDriver";

   static {
      try {

         Thread.currentThread().getContextClassLoader().loadClass(dbDriverClass).newInstance();
      } catch (InstantiationException e1) {
         // TODO Auto-generated catch block
         e1.printStackTrace();
      } catch (IllegalAccessException e1) {
         // TODO Auto-generated catch block
         e1.printStackTrace();

      } catch (ClassNotFoundException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   private final JButton btnConnect, btnRefresh;

   private final JTextField txtSQL;

   private final JTable table;

   private final JScrollPane scrollPane;

   private final DefaultTableModel dtm;

   private final javax.swing.JPanel btnPanel, contentPanel;

   private final String dbPath = "C:/Users/test/Desktop/datenbank.mdb";

   private final String dbUser = "Administrator";

   private final String dbpasswd = "";

   // Leerzeichen zwischen : und D entfernen...
   private final String dbURL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" + dbPath;

   private Connection con;

   private ResultSet rs;

   public JTableExample() {
      super("JTableExample");

      GridBagConstraints gridBagConstraints;

      contentPanel = new JPanel();
      btnPanel = new JPanel();
      btnConnect = new JButton();
      btnRefresh = new JButton();
      txtSQL = new JTextField();
      scrollPane = new JScrollPane();
      table = new JTable();
      dtm = new DefaultTableModel();

      getContentPane().setLayout(new FlowLayout());

      setTitle("JTableExample");
      addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent evt) {
            try {
               if (con != null && !con.isClosed()) {
                  con.close();
               }
            } catch (SQLException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
            setVisible(false);
            dispose();
            System.exit(0);
         }
      });

      contentPanel.setLayout(new GridBagLayout());

      contentPanel.setBackground(new Color(102, 153, 255));
      contentPanel.setMinimumSize(new Dimension(400, 300));
      contentPanel.setPreferredSize(new Dimension(400, 300));
      btnPanel.setBackground(new Color(255, 153, 51));
      btnPanel.setMinimumSize(new Dimension(400, 100));
      btnPanel.setPreferredSize(new Dimension(400, 100));
      btnConnect.setText("Connect");
      btnPanel.add(btnConnect);

      btnRefresh.setText("Refresh");
      btnPanel.add(btnRefresh);

      txtSQL.setColumns(25);
      btnPanel.add(txtSQL);

      gridBagConstraints = new GridBagConstraints();
      gridBagConstraints.gridx = 0;
      gridBagConstraints.gridy = 1;
      contentPanel.add(btnPanel, gridBagConstraints);

      scrollPane.setMinimumSize(new Dimension(400, 200));
      scrollPane.setPreferredSize(new Dimension(400, 200));
      table.setModel(dtm);
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      scrollPane.setViewportView(table);

      contentPanel.add(scrollPane, new GridBagConstraints());

      getContentPane().add(contentPanel);

      setSize(400, 300);

      Container container = getContentPane();
      btnConnect.addActionListener(new ActionListener() {

         public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            connect();
         }

      });
      btnRefresh.addActionListener(new ActionListener() {

         public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            refresh();
         }

      });

      setVisible(true);
   }

   /**
     * 
     */
   protected void refresh() {
      // TODO Auto-generated method stub
      try {
         if (con == null || con.isClosed()) {
            JOptionPane.showMessageDialog(this, "Keine Datenbaknverbindung!", "Fehler", JOptionPane.ERROR_MESSAGE);
            return;
         }
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

      Statement stmt = null;
      try {
         stmt = con.createStatement();
      } catch (SQLException e1) {
         // TODO Auto-generated catch block
         e1.printStackTrace();
      }

      if (stmt == null) {
         throw new RuntimeException("stmt is null");
      }

      String sql = txtSQL.getText();
      if (sql == null) {
         JOptionPane.showMessageDialog(this, "Keine SQL Abfrage angegeben!", "Fehler", JOptionPane.ERROR_MESSAGE);
         return;
      }
      try {
         rs = stmt.executeQuery(sql);

      } catch (SQLException e2) {
         // TODO Auto-generated catch block
         e2.printStackTrace();
      }

      putRSinTableModel(rs, dtm);

      table.setModel(dtm);

      table.updateUI();

   }

   /**
    * @param rs
    * @param dtm
    */
   private void putRSinTableModel(ResultSet rs, DefaultTableModel dtm) {
      // TODO Auto-generated method stub
      ResultSetMetaData rsmd = null;
      int clmCnt = -1;
      try {
         rsmd = rs.getMetaData();
         clmCnt = rsmd.getColumnCount();

      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

      if (rsmd == null || clmCnt == -1) {
         throw new RuntimeException("rsmd is null");
      }
      try {

         Object[] clmHeaders = new Object[clmCnt];
         for (int i = 1; i <= clmCnt; i++) {
            clmHeaders[i - 1] = rsmd.getColumnName(i);
         }

         Vector rows = new Vector();
         Vector rowData = null;

         int row = 0;
         while (rs.next()) {
            rowData = new Vector();
            for (int i = 1; i <= clmCnt; i++) {
               String fieldVal = rs.getString(i);
               System.out.print(fieldVal + " ");
               rowData.add(fieldVal);
            }
            rows.add(rowData);
            System.out.println();
         }
         dtm.setDataVector(rows, new Vector(Arrays.asList(clmHeaders)));
      } catch (SQLException e1) {
         // TODO Auto-generated catch block
         e1.printStackTrace();
      }
   }

   /**
     * 
     */
   protected void connect() {
      // TODO Auto-generated method stub
      if (con != null)
         return;
      System.out.println(dbURL);
      try {
         con = DriverManager.getConnection(dbURL, dbUser, dbpasswd);
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new JTableExample();
   }
}
```


Sobald ich eine Verbindung aufbauen möchte, erscheint die Folgende Fehlermeldung:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Datenbank '(unbekannt)' konnte nicht geöffnet werden. Entweder wird die Datenbank nicht von Ihrer Anwendung erkannt, oder die Datei ist beschädigt.

Die Datenbank ist aber vorhanden :bahnhof:


----------



## Camill (6. Jun 2012)

Wenn ich nichts übersehen habe fehlt etwas Grundlegendes - das Laden des Treibers.
Hier findest du ein Beispiel.

€: Na da habe ich wohl wircklich etwas übersehen, brauchst diesen beitrag somit nicht beachten.


----------



## SlaterB (6. Jun 2012)

funktioniert das hier?
http://www.java-forum.org/datenbank...dbcodbc-bruecke-einbinden-datenbank-java.html

wie ist die Datenbank angelegt, gibt es dafür verläßliche Vorhehensweisen?
die Fehlermeldung kann man halbwegs gut suchen, führt auch zu paar Themen hier im Forum,
mehr als evtl. falschen Pfad oder eben schlecht angelegte DB habe ich noch nicht als Ursache gesehen

@Camill
>  Thread.currentThread().getContextClassLoader().loadClass(dbDriverClass).newInstance();
am Anfang?

aber ja, über die 300 Zeilen wollte ich auch meckern, eine einfache main mit 10 Zeilen ginge genauso


----------



## epitox (12. Jun 2012)

```
Vector columnNames = new Vector();
                                Vector data = new Vector();
                                try{       
                                    //Abfrage definieren
                                    query = "SELECT * FROM bmaterial WHERE Artikel LIKE '%"+artikel+"%' AND Abteilung LIKE '%"+abt+"%' AND Einheit LIKE '%"+einheit+"%'";
                                    //Datenbankverbindung herstellen
                                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                                    Connection con=DriverManager.getConnection( "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/EDV/Allgemein/Toner-Ausgabe-Tool/toner.mdb","","" );

                                    //Ein SQL-Statement wird erzeugt
                                    Statement stmt = con.createStatement();
                                    ResultSet rst = stmt.executeQuery(query);
                                    ResultSetMetaData md = rst.getMetaData();
                                    int columns = md.getColumnCount();
                                    //  Spaltennamen ermitteln
                                    for (int i = 1; i <= columns; i++) {
                                        String colname=md.getColumnName(i);
                                        columnNames.addElement( colname );
                                    }
                                    //  Zeileninhalt ermitteln
                                    while (rst.next()) {
                                        Vector row = new Vector(columns);
                                        for (int i = 1; i <= columns; i++) {
                                            artikelanzahl++;
                                            row.addElement( rst.getObject(i) );
                                        }
                                        data.addElement( row );
                                    }
                                    rst.close();
                                    stmt.close();
                                    con.close();
                                } catch(Exception e) {
                                    System.out.println("Exception: " + e);
                                }
```

Liest bei mir Daten aus einer Access-DB aus und erzeugt daraus eine Tabelle, aber den Verbindungsaufbau solltest du übernehmen können


----------

