# In Access-Datenbank schreiben



## Gast (4. Jun 2004)

Funktioniert irgendwie nicht.

Könnt ihr mir sagen wo der Fehler steckt ?
Es wird nämlich gar nichts in die DB geschrieben. Es gibt aber auch keinen Fehler.


```
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.*;

public class zeit {
    
    public void storeQuote() {
        String datasource = "jdbc:odbc:Zeit";
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection conn = DriverManager.getConnection(datasource, "", "");
            PreparedStatement pstmt = conn.prepareStatement(
             "INSERT INTO Stocks VALUES(?, ?, ?, ?, ?)");
            pstmt.setString(1, "1");
            pstmt.setString(2, "'04.06.04'");
            pstmt.setString(3, "'07:30'");
            pstmt.setString(3, "'16:30'"); 
            pstmt.setString(3, "'7:45'"); 
            pstmt.executeUpdate();
            conn.close();
        } catch (SQLException sqe) {
            System.out.println("SQL Error: " + sqe.getMessage());
        } catch (ClassNotFoundException cnfe) {
            System.out.println(cnfe.getMessage());
        }
    }
    public static void main(String[] arguments) {
        zeit qd = new zeit();
   
    }
}
```


----------



## P3AC3MAK3R (4. Jun 2004)

Ins JDBC-Forum verschoben.


----------



## DP (4. Jun 2004)

du musst einen commit abschicken oder im odbc-treiber den autocommit aktivieren. cu


----------



## Guest (13. Aug 2004)

Hallo!

Ich habe das gleiche Problem (ebenfalls ODBC mit Access-Datenbank). Beim einmaligen Inserten passiert nichts (autoCommit ist true und explizites commit bzw. closen der Connection bringen auch nichts). Erst wenn ich gleich darauf ein zweites mal ein insert mache, wird der erste Datensatz eingefügt.

Was kann ich denn da falsch gemacht haben? der return-parameter von executeUpdate() ist 1. D.h. ein Datensatz wurde geändert. Das würde ja auch noch passen.


----------



## DP (13. Aug 2004)

mach doch mal dein update und schliesse das access und starte es wieder. evtl. ist die aktualiserung von eckes nur buggy...


----------



## Espiritu (13. Aug 2004)

Hab ich schon probiert, aber der Datensatz ist wirklich nicht drinnen.

Bin jetzt noch auf folgendes draufgekommen: die Methode executeUpdate (vom PreparedStatement) liefert 1 zurück; aber wenn ichs mit execute probiere, wird false zurückgegeben.

Das würde dann ja heißen, dass meine Query nicht stimmt, oder?
[edit] OK, sorry, bei ddl-statements wird ja kein ResultSet zurückgeliefert, ergo ist auch der Rückgabetyp von execute false. [/edit]

Hier jedenfalls mal der Code (ist schon ein bisserl unübersichtlich)

```
public boolean updateQuery(String query, Object... params)
{
    int rs = -1;
    boolean b = false;
//    PreparedStatement stmt = null;
    Statement stmt = null;
		
    Connection con = null;
    try
    {
        Class.forName(DbConnection.DRIVER_MS);
    }
    catch (ClassNotFoundException e)
    {
        System.err.println("Fehler beim Laden der Datenbanktreiber!");
        e.printStackTrace();
        System.err.println("=======================================");
        return false;
    }

    String url = DbConnection.DB_URL_MS + DbConnection.DB_NAME;
    try
    {
        con = DriverManager.getConnection(url, "", "");
    }
    catch (SQLException e)
    {
        System.err.println("Fehler beim Datenbank-Verbindungsaufbau!");
        e.printStackTrace();
        System.err.println("========================================");
    }
		
    try
    {
//    stmt = con.prepareStatement(query);
        stmt = con.createStatement();
        System.out.println(con.getAutoCommit());
			
        int index = 1;
        for (Object obj : params)
        {
//            this.setParam(index, obj);
            index++;
        }
        System.out.println(query);
        b = stmt.execute(query);
//        rs = stmt.executeUpdate();
        con.commit();
        con.close();
    }
    catch (SQLException e)
    {
        System.err.println("Fehler beim Ausführen der Query!");
        e.printStackTrace();
        System.err.println("================================");
        return false;
    }
		
    return b;
//    return rs;
}
```

Aufruf:

```
String query =
        "insert into Test(bla,hui,super) values ('a',1,'b')";
		
    System.out.println(wrapper.updateQuery(query, "a",1,"b"));
    /*
    query =
        "insert into Test(bla,hui,super) values ('b',1,'a')";
    System.out.println(wrapper.updateQuery(query, "b",1,"a"));
    */
```

Die Tabelle Test hat eben die Attribute bla varchar(50), hui integer, super varchar(50)
also müsste das auch so passen... ich steh voll daneben

Mit einem "normalen" Statement funktioniert's übrigens auch nicht...

[edit]
Hab jetzt rausgefunden wie es geht: ich muss die Connection closen UND access neu starten.
Aber das is ja blöd, ich will ja nicht für jede Query eine neue Verbindung auf- und wieder abbauen...
Hat da jemand eine Idee?
[/edit]


----------



## nollario (14. Aug 2004)

eins ist klar: die lösung liegt nicht innerhalb von java... da ist access das problem. die änderungen werden wohl erst durch schliessen der connection commited.

wenns irgendwie geht - nutzt eine vernünftige db (mysql, sapdb, cloudscape, ...)


----------



## Espiritu (15. Aug 2004)

Naja, committed wird immer "eins im nachhinein" Wenn ich zwei inserts durchführe (mit einer Connection), wird nur das erste in die DB geschrieben. Beim dritten insert, wird das zweite insert committed, etc.

MySQL ist sicher ne bessere Alternative; das Problem ist aber, dass mein Tool DBMS-unabhängig sein soll, also auf Access, MySQL, Oracle, etc. laufen soll.

Danke jedenfalls für eure Hilfe


----------



## DP (15. Aug 2004)

so rdbms-unabhängig kannste dein tool garnicht machen... fängt schon bei den treibern an und hört bei der syntax auf...


----------



## Espiritu (16. Aug 2004)

Treiber is klar; die muss ich dann der DB entsprechend laden...
Wegen Syntax: Naja, is ein bisserl umständlich, aber ich werd mich an den sql-92 standard halten, also nur "primitive" datentypen und ddl- und dml-queries. Dann hoff ich, dass das dann einigermaßen hinhaut.


----------



## nollario (17. Aug 2004)

stimmt: ansi sql standard sollte von allen herstellern unterstützt werden...


----------

