# JDBC Verbindung in einer Funktion



## XoxoL (17. Nov 2009)

Guten Abend allersetits,

ich bin ein Anfänger in javaprogrammierung und bin bereit mir alles anzuhören was mir weiter hilft.

Ich versuche eine Verwaltunssoftware für eine Access Datenbank zu schreiben und verstehe noch nicht ganz wie das mit der verbindung zu Daten bank und Ausführen von SQLStatements funktioniert.

Ich habe ein Klasse dbconnect und ein Klasse dbFunktion. In der Klasse dbConnect sollen nur  Funktionen sein die die Verbindung, Trenung und Ausführung von SQLStatements ermöglichen z.B. connect(), disconnect(), executeQuery(String qr) und executeUpdate(String qr).

Mein Problem ist ich bringe es nicht fertig die funktionen so zu schreiben, dass ich diese mehrmals benutzen kann.

meine dbconnect Klasse sieht so aus

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

public class dbconnection {
	
	private static String DBdriver = "sun.jdbc.odbc.JdbcOdbcDriver";
    private static String DBurl = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};"
+"DBQ=C:/Users/-XoxoL-/workspace/Buchbinderei_Backup_Backup.mdb";
    Connection con;
    Statement stmt;
    ResultSet rs;
    ResultSetMetaData rsmd;
    int clmCnt;
    String tmp;

    dbconnection() {
        this.con = null;
        this.stmt = null;
        this.rs = null;
        this.rsmd = null;
        this.clmCnt = 0;
        this.tmp = null;
    }

    public void connect(String qr) throws Exception {


        Class.forName(DBdriver);

        con = DriverManager.getConnection(DBurl);
        stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,   ResultSet.CONCUR_UPDATABLE);
        rs = stmt.executeQuery(qr);
        rsmd = rs.getMetaData();
        clmCnt = rsmd.getColumnCount();

    }

    public void dbdisconnect() throws Exception {
        rs.close();
        stmt.close();
        con.close();
    }
}
```

also ich muss einen SQLStatement an die Funktion connect übergeben
ich will aber eine eigenständige Funktion zum Verbinden und eine zum Ausführen von sql damit ich in einen anderen funktion diese einfach ufrufen kann z.B.


```
public void showKunden(){
    dbconnect.connect();
    dbconnect.executeQuery("SELECT * FROM Kunden");
    ..........
    ..........
    dbdisconnect();
}
```

wenn mir jemand einen Schupser geben könnte wäre ich sehr verbunden
hoffe jemanden irgendwann auch helfen zu können.
vielen Dank für euere Mühe


----------



## SlaterB (18. Nov 2009)

aus connect() muss der Parameter raus und aller Code hinter Zeile 33,
dieser Code kommt dann in eine neue Methode executeQuery eben MIT dem Parameter qr

falls du mehrere Querys mit einer Connection ausführen willst,
solltest du darauf achten, die alten ResultSets zu schließen oder zumindest alle bis zum Schluss zu merken und dann zu schließen


----------



## XoxoL (18. Nov 2009)

Vielen Danj für eine schnelle Antwort!


----------



## SlaterB (18. Nov 2009)

13 Stunden sind schnelle Antwort? 
da kann ich mich ja ab jetzt zurücklehnen


----------



## XoxoL (18. Nov 2009)

Ehrlich gesagt habe ich nicht so schnell mit einer Antwort gerechnet, deswegen. :toll:
Ich werde das zuhause ausprobieren bin gerade auf der Arbeit. Danke


----------



## XoxoL (18. Nov 2009)

dein Tip funktioniert super. :toll: danke. allerdings habe ich weiters Problem in der Funktion executeUpdate ???:L


```
stmt = con.createStatement();
        rs = stmt.executeUpdate(qr);
        rsmd = rs.getMetaData();
        clmCnt = rsmd.getColumnCount();
```
das Problem ist, dass das executeUpdate() einen int zurückgibt, aber wenn ich es so mache

```
stmt = con.createStatement();
        int t = stmt.executeUpdate(qr);
        rsmd = rs.getMetaData();
        clmCnt = rsmd.getColumnCount();
```

bekome ich eine Fehlermeldung: ResultSet is closed und verweist uf die Zeile

```
rsmd = rs.getMetaData();
```
wie soll ich den hier am besten vorgehen? damit ich die Daten entlich in die Datenbak bekomme


----------



## SlaterB (18. Nov 2009)

bei einem executeUpdate bekommst du wirklich nur einen int,
es ist falsch danach auf ein völlig anderes ResultSet zuzugreifen oder was auch immer,
streiche die letzten beiden Befehle, mach noch was mit dem int-Wert oder gar nix mehr


----------



## XoxoL (19. Nov 2009)

Danke diesmal war es wirklich schnell :meld:. Jetzt  bekomme ich keine Fehlermeldung aber auch kein Resultat. Aus C++ weis ich :rtfm: ,dass nach so einer Operation ein update kommen muss ist es hier auch der Fall? Wenn ja dann wie?


----------



## SlaterB (19. Nov 2009)

was ist denn 'so eine Operation', meinst du das executeUpdate?
was bedeutet es, wenn 'nach einem executeUpdate noch ein update kommen muss'?

das Update ändert Daten in der DB, folgende Selects sollten geänderte Daten laden,
andere Connections/ Programme sehen die Änderungen evtl. erst nach einen Commit


----------



## XoxoL (19. Nov 2009)

Entschuldige bitte für die geklaute Zeit , hab das Problem behoben  es muss so aussehen:

```
public void executeUpdate(String qr) throws Exception {
        connect();
        stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,    ResultSet.CONCUR_UPDATABLE);
        stmt.executeUpdate(qr);
        stmt.close();
        con.close();
    }
```
und so geht es auch!


----------

