# Access Datenbank



## MaxG. (14. Mrz 2017)

Hi,
ich wollte mal was mit Datenbanken machen und hab ein Java Programm programmiert das Daten in eine Access Datenbank speichert. Das Problem ist, dass es Probleme mit dem Treiber gibt. Es kommt immer eine Exeption. Was hab ich falsch gemacht? Hier noch der Code:

```
package Gui;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import Core.Datenbank;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;;

public class UserInterface extends JFrame{
   
    public JPanel inputContainer;
    public JPanel adresse;
    public JPanel kontakt;
    public JPanel name;
    public JPanel buttonContainer;
   
    public JLabel labelNachname;
    public JLabel labelVorname;
    public JLabel labelAnrede;
    public JLabel labelStraße;
    public JLabel labelHausnummer;
    public JLabel labelOrt;
    public JLabel labelEmail;
    public JLabel labelTelefonnummer;
   
    public JTextField textfieldNachname;
    public JTextField textfieldVorname;
    public JTextField textfieldStraße;
    public JTextField textfieldHausnummer;
    public JTextField textfieldOrt;
    public JTextField textfieldEmail;
    public JTextField textfieldTelefonnummer;
   
    public JComboBox<String> comboboxAnrede;
   
    public JButton save;
    public JButton cancel;
   
    String comboBoxListe[] = {"Auswählen", "Herr", "Frau"};
   
    public UserInterface(){
        this.setTitle("Address-Buch");
        this.setSize(300,270);
        this.setLayout(new BorderLayout());
       
       
       
        inputContainer = new JPanel();
        inputContainer.setLayout(new BorderLayout());
       
        name = new JPanel();
        name.setLayout(new GridLayout(3,2,2,2));
       
        labelAnrede = new JLabel("Anrede");
        labelNachname = new JLabel("Nachname");
        labelVorname = new JLabel("Vorname");
       
        comboboxAnrede = new JComboBox<>(comboBoxListe);
       
        textfieldNachname = new JTextField(10);
        textfieldVorname = new JTextField(10);
       
        name.add(labelAnrede);
        name.add(comboboxAnrede);
        name.add(labelNachname);
        name.add(textfieldNachname);
        name.add(labelVorname);
        name.add(textfieldVorname);
       
       
        adresse = new JPanel();
        adresse.setLayout(new GridLayout(3,2,2,2));
       
        labelOrt = new JLabel("Ort");
        labelStraße = new JLabel("Straße");
        labelHausnummer = new JLabel("Hausnummer");
       
        textfieldOrt = new JTextField(10);
        textfieldStraße = new JTextField(10);
        textfieldHausnummer = new JTextField(10);
       
        adresse.add(labelOrt);
        adresse.add(textfieldOrt);
        adresse.add(labelStraße);
        adresse.add(textfieldStraße);
        adresse.add(labelHausnummer);
        adresse.add(textfieldHausnummer);
       
       
        kontakt = new JPanel();
        kontakt.setLayout(new GridLayout(2,2,2,2));
       
        labelEmail = new JLabel("E-Mail");
        labelTelefonnummer = new JLabel("Telefonnummer");
       
        textfieldEmail = new JTextField(10);
        textfieldTelefonnummer = new JTextField(10);
       
        kontakt.add(labelEmail);
        kontakt.add(textfieldEmail);
        kontakt.add(labelTelefonnummer);
        kontakt.add(textfieldTelefonnummer);
       
       
        buttonContainer = new JPanel();
        buttonContainer.setLayout(new FlowLayout());
       
        save = new JButton("Speichern");
        cancel = new JButton("Abbrechen");
       
        buttonContainer.add(save);
        buttonContainer.add(cancel);
       
       
        inputContainer.add(name, BorderLayout.NORTH);
        inputContainer.add(adresse, BorderLayout.CENTER);
        inputContainer.add(kontakt, BorderLayout.SOUTH);
       
        this.add(inputContainer, BorderLayout.CENTER);
        this.add(buttonContainer,BorderLayout.SOUTH);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
   
    public void showWindow(){
        this.setVisible(true);
    }
   
    public void listener(){
        save.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent a) {
                // TODO Auto-generated method stub
                String nachname, vorname, straße, ort, eMail, anrede;
                int hausnummer = 0;
                long telefonnummer = 0;
                boolean statusHausnummer = true, statusTelefonnummer = true, statusAnrede = true;
               
                nachname = textfieldNachname.getText();
                vorname = textfieldVorname.getText();
                straße = textfieldStraße.getText();
                ort = textfieldOrt.getText();
                eMail = textfieldEmail.getText();
                anrede = (String) comboboxAnrede.getSelectedItem();
               
                try{
                    telefonnummer = Long.parseLong(textfieldTelefonnummer.getText());
                    statusTelefonnummer = true;
                }catch(NumberFormatException e){
                    JOptionPane.showMessageDialog(null, "Bitte gülitige Telefonnummer eingeben!");
                    statusTelefonnummer = false;
                }
               
               
                try{
                    hausnummer = Integer.parseInt(textfieldHausnummer.getText());
                    statusHausnummer = true;
                    if(hausnummer > 10000){
                        JOptionPane.showMessageDialog(null, "Bitte gülitige Hausnummer eingeben!");
                        statusHausnummer = false;
                        textfieldHausnummer.setText(null);
                    }
                }catch(NumberFormatException e){
                    JOptionPane.showMessageDialog(null, "Bitte gülitige Hausnummer eingeben!");
                    statusHausnummer = false;
                }
               
                if(anrede.equals("Auswählen")){
                    JOptionPane.showMessageDialog(null, "Bitte Anrede wählen");
                    statusAnrede = false;
                }else{
                    statusAnrede = true;
                }
               
                if(statusAnrede == true && statusTelefonnummer == true && statusHausnummer == true){
                    System.out.println("Saved");
                   
                    Datenbank db = new Datenbank(anrede,nachname,vorname,ort,straße,hausnummer,eMail,telefonnummer);
                   
                }
               
            }
        });
       
       
        cancel.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent a) {
                // TODO Auto-generated method stub
                textfieldNachname.setText(null);
                textfieldVorname.setText(null);
                textfieldStraße.setText(null);
                textfieldHausnummer.setText(null);
                textfieldOrt.setText(null);
                textfieldEmail.setText(null);
                textfieldTelefonnummer.setText(null);
                comboboxAnrede.setSelectedItem("Auswählen");
            }
        });
    }

}
```


```
package Run;

import Gui.UserInterface;

public class RunProgramm {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        UserInterface gui = new UserInterface();
        gui.showWindow();
        gui.listener();
    }

}
```


```
package Core;

import java.sql.*;

public class Datenbank {

    private String driverClass = "sun.jdbc.odbc.JdbcOdbcDriver";
    private String url = " jdbc:odbc:Driver={Microsoft Access Driver (*.accdb)};DBQ=C:/Users/grohmann/Documents/Kontaktverwaltung.accdb";
    private Connection con;
    private Statement stmt;
    private ResultSet rs;

   
    public Datenbank(String anrede, String nachname, String vorname, String ort, String straße, int hausnummer, String eMail, long telefonnummer){
       
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException e){
            System.out.println("Datenbanktreiber nicht gefunden");
        }
       
        try {
            con = DriverManager.getConnection(url,"","");
        } catch (SQLException e) {
            System.out.println("Connection fehlgeschlagen");
        }
       
        try {
            stmt = con.createStatement();
        } catch (SQLException e) {
            System.out.println("Statement fehlgeschlagen");
        }
       
        try {
            rs = stmt.executeQuery("INSERT INTO Tabelle1 (Anrede, Nachname, Vorname, Ort, Straße, Hausnummer, E-Mail, Telefonnummer, VALUES ("+ anrede + ", " + nachname + ", " + vorname + ", " + ort + ", " + straße + ", " + hausnummer + ", " + eMail + ", " + telefonnummer + ")");           
        } catch (SQLException e) {
            System.out.println("Query Fehlgeschlagen");
        }
       
    }
   
}
```

Die Datenbank heißt Kontaktverwaltung und liegt unter folgendem pfad: 
C:\Users\grohmann\Documents\Kontaktverwaltung.accdb


----------



## Harry Kane (14. Mrz 2017)

MaxG. hat gesagt.:


> Das Problem ist, dass es Probleme mit dem Treiber gibt. Es kommt immer eine Exeption.


Bei Exceptions IMMER den Stack trace mit posten, und die Zeile in deinem Code angeben.


----------



## MaxG. (14. Mrz 2017)

Console:
Saved
Datenbanktreiber nicht gefunden
Connection fehlgeschlagen
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Core.Datenbank.<init>(Datenbank.java:29)
    at Gui.UserInterface$1.actionPerformed(UserInterface.java:188)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)


----------



## MaxG. (14. Mrz 2017)

Da in der Konsole "Datenbanktreiber nicht gefunden" und "Connection fehlgeschlagen" erscheint wird wohl die ClassNotFoundException und die SQLException in der Klasse Datenbank ausgelöst.


----------



## Joose (14. Mrz 2017)

Du liegst richtig


----------



## MaxG. (14. Mrz 2017)

Woran liegt das dass die Exeptions ausgelöst werden ??


----------



## MaxG. (14. Mrz 2017)

bzw. was muss ich anderst machen das die Exeptions nicht mehr ausgelöst werden und das Programm auch das macht was es soll?


----------



## Thallius (14. Mrz 2017)

Ganz ehrlich? Der Fehler liegt schon im Konzept. Access ist seit 20 Jahren tot. Nimm irgendeine aktuelle Datenbank

Gruß

Claus


----------



## mrBrown (14. Mrz 2017)

MaxG. hat gesagt.:


> bzw. was muss ich anderst machen das die Exeptions nicht mehr ausgelöst werden und das Programm auch das macht was es soll?


Den Treiber im Classpath hinterlegen  Am einfachsten ists mit maven oder gradle...



Thallius hat gesagt.:


> Ganz ehrlich? Der Fehler liegt schon im Konzept. Access ist seit 20 Jahren tot. Nimm irgendeine aktuelle Datenbank


Um dann vor dem gleichem Problem zu stehen? Super Tipp


----------



## MaxG. (14. Mrz 2017)

Habs ausprobiert, immer noch der gleiche Fehler


----------



## mrBrown (14. Mrz 2017)

Und *was* hast du probiert?


----------



## MaxG. (14. Mrz 2017)

Den Treiber im Classpath zu hinterlegen


----------



## JStein52 (14. Mrz 2017)

Was hast du wo hinterlegt ?


----------



## MaxG. (15. Mrz 2017)

Ich Arbeite mit Eclipse und Habe über Project-> Properties-> Java Build Path-> Libaries-> Add Libary...-> Marven Managed Dependencies eingebunden

Ich habe noch ein Video gefunden allerdings für MySQL. Dort musste man einen Connector herunterladen. Benötigt man den unter Access auch und wenn ja, wo bekommt man den her?

Hab diesen link noch dafür gefunden: http://www.easysoft.com/applications/microsoft-access/jdbc-odbc.html


----------



## Harry Kane (15. Mrz 2017)

Die Forumssuche zeigt, dass die JDBC-ODBC-Bridge mit Java 8 nicht mehr unterstützt wird. D. h. man braucht weitere/andere Jars.
Recommended reading: http://stackoverflow.com/questions/...un-jdbc-odbc-jdbcodbcdriver-exception-occurin


----------



## Thallius (15. Mrz 2017)

Soweit zu



mrBrown hat gesagt.:


> Um dann vor dem gleichem Problem zu stehen? Super Tipp



....


----------



## HarleyDavidson (15. Mrz 2017)

Wenn du wirklich was mit Datenbanken machen willst, empfehle ich dir diese hier:
http://www.h2database.com
Klein, unkompliziert, verfügt aber über die volle Funktionalität. Und gute Tutorials gibt es auch dazu.
Access in einem Satz mit dem Wort Datenbank zu verwenden ist schon grenzwertig  (Sorry, musste sein)


----------



## Thallius (15. Mrz 2017)

Ich würde zum Anfang immer empfehlen SQLite zu nehmen. Das läuft ohne Server und ist eigentlich zu 99% kompatibel zu SQL. Man lernt also gleich etwas das man später auch bei "richtigen " Datenbanken verwenden kann.

Gruß

Claus


----------



## JarJarBinks (15. Mrz 2017)

Mahlzeit,

Also falls du Java 8 verwendest ist diese JDBC-ODBC-Bridge nicht mehr verfügbar.
Zumindest auf den ersten Blick.
Du kannst die JdbcOdbc.dll und jdbcodbc.jar aus Java 7 in dein Java 8 einbinden.



Spoiler: Spoiler



Die JdbcOdbc.dll muss in den bin-Ordner von der Java 8 JRE, der normalerweise unter C:\ Program Files \ Java \ jdk1.8.x \ jre \ bin zu finden ist.

Die jdbcodbc.jar muss in den ext-Ordner der Java 8 JRE Library, der normalerweise unter C:\ Program Files \ Java \ jdk1.8.x \ jre \ lib \ ext zu finden ist.



Gruß,
JarJar


----------



## JStein52 (15. Mrz 2017)

@MaxG. bist du denn durch irgendwas auf Access festgelegt ? Falls nein ist dies wirklich die schlechteste aller Alternativen. SQLLite oder H2DB wären für den Einstieg die besten Alternativen. (Beide oben schon erwähnt)


----------



## MaxG. (16. Mrz 2017)

@JStein52 Ja bin leider an Access gebunden da wir damit auch in der Berufsschule arbeiten werden.


----------



## MaxG. (16. Mrz 2017)

Hab jetzt den ersten Fehler gefunden, musste noch als JRE Java 7 angeben. Jetzt kennt er wenigstens den Treiber. Habe jetzt aber noch das Problem mit der Connection, wie setzt die sich zusammen??


----------



## Harry Kane (16. Mrz 2017)

MaxG. hat gesagt.:


> Habe jetzt aber noch das Problem mit der Connection, wie setzt die sich zusammen??


Aus Con und nection. Kann aber auch sein, dass ich die Frage nicht verstanden habe.


----------



## Joose (16. Mrz 2017)

Harry Kane hat gesagt.:


> Aus Con und nection. Kann aber auch sein, dass ich die Frage nicht verstanden habe.


Es wird um den ConnectionString für Access gehen


----------



## MaxG. (16. Mrz 2017)

Ja es geht um den ConnectionString für Access


----------



## MaxG. (17. Mrz 2017)

Das ist die Aktuelle Consolen-Fehlermeldung:


```
java.sql.SQLException: No suitable driver found for  jdbc:odbc:Kontaktverwaltung
Connection fehlgeschlagen
    at java.sql.DriverManager.getConnection(DriverManager.java:596)
    at java.sql.DriverManager.getConnection(DriverManager.java:233)
    at Core.Datenbank.<init>(Datenbank.java:23)
    at Gui.UserInterface$1.actionPerformed(UserInterface.java:188)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6516)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6281)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4872)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Core.Datenbank.<init>(Datenbank.java:30)
    at Gui.UserInterface$1.actionPerformed(UserInterface.java:188)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6516)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6281)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4872)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
```


----------



## MaxG. (17. Mrz 2017)

Sorry für den Smiley, habs nicht überprüft


----------



## Flown (17. Mrz 2017)

Setz doch nächstes mal den StackTrace in Code-Tags: [code]StackTrace[/code]


----------



## MaxG. (17. Mrz 2017)

Jap wird gemacht.

Hab jetzt ne Lösung für mein Programm. Mit dieser URL gehts :
	
	
	
	





```
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + "C:/Users/grohmann/workspaceTMS/Kontaktdatenbank/src/Kontaktverwaltung.accdb"
```


----------



## MaxG. (20. Mrz 2017)

Mein neues Problem ist das kein ResultSet produziert wird.
Fehlermeldung: 
	
	
	
	





```
java.sql.SQLException: No ResultSet was produced
```

Code: 
	
	
	
	





```
try {
            rs = stmt.executeQuery(myQuery);            
        } catch (SQLException e) {
            System.out.println("Query Fehlgeschlagen");
            e.printStackTrace();
        }
```

Woran liegt das?


----------



## JStein52 (20. Mrz 2017)

Was für eine Query ist das denn ?


----------



## stg (20. Mrz 2017)

Vermutlich schreibst du in deinem Query statt zu lesen.


----------



## MaxG. (20. Mrz 2017)

```
private String myQuery = "INSERT INTO Tabelle1 VALUES('1' , 'Herr' , 'Nachname' , 'Vorname' , 'Ort' , 'Straße' , '3' , 'email' , '08374')";
```


----------



## Joose (20. Mrz 2017)

Ein INSERT kann dir kein ResultSet liefern.
Wenn es dir was zurückliefert dann nur ein "int" welches dir angibt wieviele Rows in die Tabelle eingetragen wurden. Bzw -1 wenn nichts eingetragen wurde.


----------



## Flown (20. Mrz 2017)

Versuchs doch eher mit `executeUpdate`


----------



## MaxG. (20. Mrz 2017)

Danke hat funktioniert


----------



## MaxG. (20. Mrz 2017)

Allerdings hab ich schon wieder das nächste Problem. Kann man bei einem Insert auch Variablen als werte nehmen ??
Etwa so:
	
	
	
	





```
String myQuery = "INSERT INTO Tabelle1(Anrede, Nachname, Vorname, Ort, Straße, Hausnummer, E-Mail, Telefonnummer, VALUES ('"+ anrede + "', '" + nachname + "' , '" + vorname + "' , '" + ort + "' , '" + straße + "' , '" + hausnummer + "' , '" + eMail + "' , '" + telefonnummer + "')";
```


----------



## Joose (20. Mrz 2017)

Ja das geht. Wo genau liegt denn das Problem?
Aber du solltest dir das Statement nicht so zusammenbauen (per String concat) sondern stattdessen PreparedStatements verwenden.

Dadurch kannst du SQLInjections verhindern, das Statement wird lesbarer und du musst nicht an die Anführungszeichen bei Strings denken (durch die entsprechenden Methoden wird das automatisch geregelt)


----------



## MaxG. (20. Mrz 2017)

Der zeigt mir aber immer einen Syntaxfehler an: 
	
	
	
	





```
java.sql.SQLException: [Microsoft][ODBC-Treiber für Microsoft Access] Syntaxfehler in der INSERT INTO-Anweisung.
```


----------



## Flown (20. Mrz 2017)

Vielleicht solltest du nochmal nachlesen wie ein Insert syntaktisch aussieht: HIER


----------



## JStein52 (20. Mrz 2017)

auf deutsch gesagt, dir fehlt da vor dem VALUES eine Klammer zu


----------



## MaxG. (20. Mrz 2017)

Danke, heute bin ich nicht ganz auf der höhe, hab ich total übersehen


----------



## MaxG. (20. Mrz 2017)

Fehler kommt aber leider immer noch


----------



## JStein52 (20. Mrz 2017)

Dann solltest du das korrigierte Statement nochmal posten


----------



## MaxG. (20. Mrz 2017)

```
String myQuery = "INSERT INTO Tabelle1(Anrede, Nachname, Vorname, Ort, Straße, Hausnummer, E-Mail, Telefonnummer) VALUES('"+ anrede + "', '" + nachname + "' , '" + vorname + "' , '" + ort + "' , '" + straße + "' , '" + hausnummer + "' , '" + eMail + "' , '" + telefonnummer + "')";
```


----------



## Flown (20. Mrz 2017)

Alles ist ist in deiner DB als String gespeichert, auch Zahlen? Was sagt denn die Exception? Möglich, dass du den ';' zum Schluss vergessen hast?


----------



## MaxG. (21. Mrz 2017)

Habs jetzt herausgefunden, es war der Bindestrich bei E-Mail
Verbesserte Funktion:
	
	
	
	





```
String myQuery = "INSERT INTO Tabelle1(Anrede, Nachname, Vorname, Ort, Straße, Hausnummer, Email, Telefonnummer) VALUES('"+ anrede + "', '" + nachname + "' , '" + vorname + "' , '" + ort + "' , '" + straße + "' , '" + hausnummer + "' , '" + eMail + "' , '" + telefonnummer + "')";
```


----------



## Neumi5694 (30. Mrz 2017)

Mit der von dir verwendeten Methode kriegst du ein Problem, wenn eine der Variablen ein einfaches Hochkomma enthält. Gerade bei Texten solltest du - anstatt den String zusammenzubauen - ein PreparedStatement verwenden (das verhindert auch, dass jemand SQL Code in eine Variable schmuggelt).
Ich hab in diesem Code auch noch die Namen der Spalten in Access markiert (diese Formatierung funktioniert NUR in Access, andere DBs haben eigene Formate) 
Damit kannst du - sofern du das vorhast - auch reservierte Worte als Spalten- und Tabellennamen verwenden.


```
try (PreparedStatement instertStatement = con.prepareStatement("INSERT INTO [Tabelle1]([Anrede], [Nachname], [Vorname], [Ort], [Straße], [Hausnummer], [Email], [Telefonnummer]) VALUES(?,?,?,?,?,?,?,?)")) {
    inserStatement.setString(1, anrede);
    inserStatement.setString(2, nachname);
    inserStatement.setString(3, vorname);
    inserStatement.setString(4, ort);
    inserStatement.setString(5, straße);
    inserStatement.setString(6, hausnummer);
    inserStatement.setString(7, eMail);
    inserStatement.setString(8, telefonnummer);
    insertSatement.executeUpdate();
}
```

ps: ExecuteUpdate liefert bei "insert" keinen brauchbaren Wert (zumindest mit MS Access), bei "update" hingegen kannst du hier prüfen, wie viele Zeilen verändert wurden.


----------



## Neumi5694 (30. Mrz 2017)

Noch eines: Im Beispiel hab ich eine sogenannte try-with-resource verwendet.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Du hast in deinem Code nämlich überall vergessen, nach der Verwendung Resultsets und Statements zu schließen.

```
try (java.io.Closeable variable = initializeMe()) {
    variable.doSomething();
}
```
entspricht

```
{
    java.io.Closeable variable = initializeMe();
    variable.doSomething();
    variable.close();
}
```
=> Variable nur innerhalb der Klammern sichtbar.
=> Am Ende des Blocks wird .close() ausgeführt, die Resource freigegeben.

Exceptions werden so NICHT behandelt, die müssen nach wie vor entweder direkt danach oder in der aufrufenden Methode behandelt werden.


----------

