# JAVA - MS Access (zum Xten mal) - Ich hänge und benötige kurz Hilfe



## krehk (2. Februar 2014)

Hallo zusammen,

ich bin seit ewigkeiten mal wieder am Programmieren und will eine .accdb anbinden und kriege einen Fehler zu dem es im Google millionen mal die selbe Antwort gibt und ich kriege es nicht hin 


```
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben
```

Es wird immer gesagt "Hast du die ODBC eingerichtet" -> ich denke Ja :-/  
Unter Sysst. -> Verwaltung -> ODBC ist dort MS Access eingerichtet und ich habe es auch unter der Win86 implementierung verifiziert... (Hier/)

Was mich wundert, wenn ich meine Libarys mal rein gucke habe ich dort nur die: "access-brige64.jar" und dachte vllt liegt es daran...
Deswegen hab ich mir mal die Bridge 2.0.2 geladen und die "access-brige32.jar" als external eingebunden. Keine veränderung.

Ich stehe gerade mega auf dem Schlauch und weiß nicht mehr wo vorne und hinten ist, wäre echt klasse wenn einer Zeit hat mir dabei mal kurz zu helfen... :-(



Hier schonmal mein Code:


```
public Connection DBAufbau() throws Exception{
	      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
	      String dbpath = "C:/FMS_TOOL/DatenbankAuto.accdb";
	      Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ="+ dbpath,"","");
	      Statement stmt = con.createStatement();
	      return con;
	}
```



Viele Grüße und einen schönen Sonntag,

Jens


----------



## saftmeister (2. Februar 2014)

Hi,

würde mich persönlich reizen, selbst zu testen. Da ich aber das Jar nicht habe, kann ich es nicht ausprobieren. Ich habe auch kein Access, daher kann ich auch keine accdb-Datei erstellen.

Was ich allerdings gesehen habe: Versuch mal statt


```
Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ="+ dbpath,"","");
```


```
Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+ dbpath,"","");
```

Das DBQ ist direkt hintern Semikolon im DSN.


----------



## krehk (2. Februar 2014)

Hallo,

leider nein, das war es auch nicht.

 Ähm ja die JAR kann ich dir schicken, nur Access nicht


----------



## saftmeister (2. Februar 2014)

Aber ne leere accdb-Datei? Evlt. mit ner simplen Tabelle?

EDIT: Ah, ähm, vergiss es, da braucht man ja auch die ODBC-Treiber und dafür vermutlich Access installiert ;-)

EDIT2: Hmm, hier gibt es den Redistributable Installer für Access: http://www.microsoft.com/de-de/download/confirmation.aspx?id=13255

Den werde ich mal installieren und schauen.

EDIT3: Ok, ich hab den ODBC-Treiber nun doch, also her mit den Files ;-)


----------



## krehk (2. Februar 2014)

Korrektur geht doch ^_^

und nochmal meine gesammte JDBC klasse _._



```
package DesktopTool;

import java.io.File;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;


/**
 * @author Tom
 * 
 */
public class AccessJdbcOdbcExample {

  /**
   * @param args
 * @throws ClassNotFoundException 
 * @throws SQLException 
   */
	public Connection DBAufbau() throws Exception{
	      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
	      String dbpath = "C:/City_Ambulanz_FMS_TOOL/DatenbankAuto.accdb";
	      Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+ dbpath,"","");
	      Statement stmt = con.createStatement();
	      return con;
	}
	
	public List AuslesenStatus(String Fahrzeug) throws Exception{
		List list = null;
		Connection con = DBAufbau();
		
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery("SELECT Status, Datum FROM Status WHERE Auto_ID = (Select ID from Auto where Auto = "+Fahrzeug+")");
		ResultSetMetaData rsmd = rs.getMetaData();
	      int clmCnt = rsmd.getColumnCount();
	      while (rs.next()) {
	          for (int i = 1; i <= clmCnt; i++) {
	              System.out.println(rs.getString(i));
	              list.add(rs.getString(i));
	          }
	      }
	    con.close();
		return list;
	}	
	
	public String AuslesenIP(String Fahrzeug) throws Exception{
		String list = null;
		Connection con = DBAufbau();
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery("SELECT IP FROM Auto WHERE Auto = "+Fahrzeug+")");

	              list =(rs.getString(0));
	          

	    con.close();
		return list;
	}	
	
	public void UpdateIP(String Fahrzeug, String IP) throws Exception{
		String list = null;
		Connection con = DBAufbau();
		Statement stmt = con.createStatement();
		stmt.executeQuery("UPDATE Auto SET IP="+IP+" WHERE Auto = "+Fahrzeug+")");        
	    con.close();
	}	
	
	public void UpdateStatus(String Fahrzeug, String Status, String Datum) throws Exception{
		String list = null;
		Connection con = DBAufbau();
		Statement stmt = con.createStatement();
		stmt.executeQuery("INSERT INTO Status(Status,Datum,Auto_ID) VALUES("+Status+","+Datum+",(SELECT ID FROM Auto WHERE AUTO ="+Fahrzeug+")))");        
	    con.close();
	}
  }
```


----------



## saftmeister (2. Februar 2014)

Cool. Wollte grade schreiben, dass es bei mir auch funktioniert. Ich hatte zwar keine DB, aber der ODBC-Administrator kann welche erstellen. Dann hat auch dieser Code hier einwandfrei funktioniert:


```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class AccessTest
{
    private static String dbpath = "C:/Projekte/AccessODBC/test.accdb";

    public static void main(String[] args)
    {
        try
        {
            // Class.forName("com.sun.java.accessibility.AccessBridge");
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection(
                    "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ="
                            + dbpath, "", "");

            Statement statement = con.createStatement();

            try
            {
                statement.executeUpdate("DROP TABLE test");
            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            }

            statement
                    .executeUpdate("CREATE TABLE test (id int not null primary key, testcol char(20))");

            statement.getConnection().commit();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

    }

}
```


----------



## saftmeister (2. Februar 2014)

Sorry, für doppel, aber eine Anmerkung habe ich noch. Sowas ist hässlich:


```
public void UpdateIP(String Fahrzeug, String IP) throws Exception{
		String list = null;
		Connection con = DBAufbau();
		Statement stmt = con.createStatement();
		stmt.executeQuery("UPDATE Auto SET IP="+IP+" WHERE Auto = "+Fahrzeug+")");        
	    con.close();
	}
```

Mach es doch besser so:


```
public void UpdateIP(String Fahrzeug, String IP) throws Exception{
		String list = null;
		Connection con = DBAufbau();
		PreparedStatement stmt = con.prepareStatement("UPDATE Auto SET IP = ? WHERE Auto = ?");
                stmt.setString(1, IP);
                stmt.setString(2, Fahrzeug);
                stmt.executeUpdate();
                stmt.getConnection().commit();
                stmt.close();
	    con.close();
	}
```

Warum? Weil man sich sonst ein Einfallstor für SQL-Injections öffnet. Außerdem ist der Code sauber und schließt alle Resourcen wieder. Der commit() ist obligatorisch, wenn du irgendwann mal mit Transaktionen arbeitest, macht es Sinn.


----------



## krehk (3. Februar 2014)

Ja, ähm da habe ich mich falsch ausgedrückt - ich meinte: anhänge klappen doch - , war auf dem Sprung zum Superbowl ^_^ --> Sorry

Es klappt bei mir leider noch nicht. 
Aber wenn es bei dir funktioniert liegt es wohl an meinem DSN Einstellungen :-/
Kannst du mal Screenis von deinem Access DSN machen? (Ich werde darüber echt verrückt)
(Ich hab übrigens ein Win7 64bit System)


Deine Anmerkungen zum Code werde ich einarbeiten, bin immer dankbar für Verbesserungen  *top*


----------



## saftmeister (3. Februar 2014)

Ich habe auch Win7 64Bit.

Heruntergeladen und installiert habe ich die 32-Bit-Version des Access-ODBC-Treibers (Link siehe oben).

Also ich habe den ODBC-Administrator - wie auf verschiedenen Seiten empfohlen - über C:\Windows\SysWOW64\odbcad32.exe. Dann habe ich meine Datenquelle als Benutzer-DSN hinzugefügt.

Den Test-Code habe ich dann schnell zusammen gepfriemelt und er läuft auf Anhieb.

EDIT: Achja, bei Erstellung der Datenquelle habe ich eine Datenbank der Version 12.x erstellt.


----------



## krehk (3. Februar 2014)

Okay, jetzt fühle ich mich wie in der ersten Klasse =/

Ich hab jetzt nochmal den Treiber installiert (wie oben im Link),
habe den DSN erzeugt (sind ja nur 3 klicks oder so),
habe im Code die neue accdb angegeben

und bekomme immer noch den selben Fehler  

Was mir Aufgefallen ist im DSN -> Klick auf "Erweitert..." sehe ich DefaultDir "C:\......" und das Feld Driver ist leer. 
Ist das bei dir genau so?


Unter der Registerkarte "Treiber" habe ich die selben wie du, nur ein paar mehr 

Wenn das so weiter geht über denke ich meinen Beruf wohl besser nochmal ... es kann doch nicht sein das ich an Access Verzweifel und hauptberuflich SAP Portal Anwendungen Baue -.-
Bisher dachte ich immer schlimmer als SAP geht nicht aber Access toppt es *kopf trifft Tisch kritisch!*


----------

