sterownik ODBC MS Access

0

Witam

Jaki sterownik trzeba dodać do biblioteki projektu aby wykonywalny jar miał połączenie z bazą danych?

Program w eklips działa prawidłowo, natomiast wykonywalny jar daje błąd:
java.sql.SQLException: [Microsoft][Menedżer sterowników ODBC] Nie można odnaleźć nazwy źródła danych, a nie ma podanego sterownika domyślnego.

Próbowałem dołączyć sterowniki ze strony microsoftu (sqljdbc_4.0.2206.100_enu, sqljdbc_4.1.5605.100_enu, jtds-1.3.1-dist, sqljdbc_3.0.1301.101_enu) ale nie daje to pozytywnych rezultatów.
Może jest inny sposób?

Connection polaczenie = null;
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=BazaAA.mdb";
polaczenie = DriverManager.getConnection (url, "", "");//połączenie

Wyjątek zgłaszany jest na ostatniej linijce kodu powyżej.

Walczę dalej, ale brak poprawnego działania:

Wyskrobałem coś takiego do testów:

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class MsAccess {

  private static final String USERNAME = "";

  private static final String PASSWORD = "";

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

  private static final String URL = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=CzystaBaza.mdb;}";

  public static void main(String[] args) {

    try {
		Class.forName(DRIVER);
	} catch (ClassNotFoundException e) {
		zapisBledu(e);
		e.printStackTrace();
	}
    Connection con = null;
	try {
		con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
	} catch (SQLException e) {
		zapisBledu(e);
		e.printStackTrace();
	}
    
    Statement stmt = null;
	try {
		stmt = con.createStatement();
	} catch (SQLException e) {
		zapisBledu(e);
		e.printStackTrace();
	}
    try {
		stmt.execute("CREATE TABLE Tabela2(ProduktID NUMBER,Cena CURRENCY, Data DATE)");
	} catch (SQLException e) {
		zapisBledu(e);
		e.printStackTrace();
	}
    try {
		stmt.close();
	} catch (SQLException e) {
		zapisBledu(e);
		e.printStackTrace();
	}

    try {
		con.close();
	} catch (SQLException e) {
		zapisBledu(e);
		e.printStackTrace();
	}
  }
  
  public static final void zapisBledu(Throwable e)
  {	  
	  PrintWriter zapis = null;
	  try {
		  zapis = new PrintWriter("log.txt");
	  } catch (FileNotFoundException w) {
		  w.printStackTrace();
	  }
      String komunikat = null;
      try
      {
          ByteArrayOutputStream ostr = new ByteArrayOutputStream();
          e.printStackTrace( new PrintWriter(ostr,true) );
          komunikat = ostr.toString();
      }
      catch (Exception f)
      {
    	  f.printStackTrace();
      }
      zapis.println(komunikat);
      zapis.println("-----------------------------------------------------------------------------");
      zapis.close();
  }
}

Błąd z loga to:

 java.sql.SQLException: [Microsoft][Menedżer sterowników ODBC] Nie można odnaleźć nazwy źródła danych, a nie ma podanego sterownika domyślnego
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at MsAccess.main(MsAccess.java:30)

Nie za bardzo wiem jak to poprawnie zrobić. Może ma ktoś poprawny przykład.

W eclipsie wszystko działa poprawnie, plik z bazą jest w katalogu z plikiem wykonywalnym jar. Testuję na kilku komputerach i efekt jest taki sam.

Jakieś sugestie?

0

Witam

Jeżeli ktoś będzie walczył z MS Access.

Standardowo obsługa MS Access nie jest już chyba wspierana, ale znalazłem biblioteki które dają taką możliwość.
Potrzebne są biblioteki:

UCanAccess
commons-lang
commons-logging
hsqldb
jackcess

http://ucanaccess.sourceforge.net/site.html

Tworzenie tabel i kolumn:

        Database db = DatabaseBuilder.create(Database.FileFormat.V2000,
                new File("new.mdb"));
        Table newTable = new TableBuilder("NewTable")
                .addColumn(new ColumnBuilder("a").setSQLType(Types.INTEGER))
                .addColumn(new ColumnBuilder("b").setSQLType(Types.VARCHAR))
                .toTable(db);
        newTable.addRow(1, "foo");

Nie mogłem znaleźć (albo nie ma ) tworzenia za pomocą CREATE TABLE.

SELECT już bardziej standardowo:

    public static  ArrayList<Integer> select(String sql) throws SQLException{
    	 
        try {
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        } catch (ClassNotFoundException e) {            
            e.printStackTrace();
        }
 
        Connection polaczenie;
        polaczenie = DriverManager.getConnection("jdbc:ucanaccess://BazaAA.mdb");        
        Statement polecenie;
        polecenie = polaczenie.createStatement();
        ResultSet krotka;
        krotka = polecenie.executeQuery(sql);
 
        ArrayList<Integer> lista = new ArrayList<Integer>();
        int id, s;    
 
        while(krotka.next()){            
            id = krotka.getInt(1);
            s = krotka.getInt(2);            
            lista.add(id, s);
        }
 
        polecenie.close();
        polaczenie.close();
        return lista;
    }
	}

Oczywiście kod należy trochę zmodyfikować pod zapytanie.

UPDATE, INSERT

	public static void updateAnat(String sql) throws SQLException{
		try {
			Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		}

		Connection polaczenie;
		polaczenie = DriverManager.getConnection("jdbc:ucanaccess://BazaAA.mdb");
		Statement polecenie;
		polecenie = polaczenie.createStatement();
		polecenie.executeUpdate(sql);	
		polecenie.close();
		polaczenie.close();
	}

U mnie po eksporcie do jar program działa prawidłowo.
Może komuś się przyda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1