2011-02-16 50 views
6

我正在構建需要與MS Access數據庫通信的桌面應用程序。現在,除非我想在每臺將要使用桌面應用程序的計算機上註冊數據庫的DSN,否則我需要一種以無DSN的方式連接到數據庫的方式。在Java中爲MS Access創建無DSN連接

我搜索了很多,發現一些有用的鏈接how to create connection strings,並基於此,我嘗試修改我的程序,但沒有成功。 下面的代碼失敗。如果我將getConnection中的字符串切換爲「jdbc:odbc:sampleDB」,它可以工作,但這是使用DSN而不是我想實現的。

如何在java中編寫和使用連接字符串以建立與MS Access數據庫的無DSN連接?

private Connection setupConnection() throws ClassNotFoundException, 
     SQLException { 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection con = DriverManager.getConnection("Driver={Microsoft Access Driver (*.mdb)} &_ Dbq=c:\\as\\sampleDB.mdb"); 
    return con; 
} 

增加:我也想指出,如果任何人有辦法達到我要求與一個DSN-方面,我會很樂意聽它的主意!

jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Nwind.mdb 

所以用搜索:

回答

5

JDBC連接字符串shouls與jdbc:像開始jdbc:odbc:[alias],例如:

Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\\as\\sampleDB.mdb"); 

如果配置DSN然後你使用simplier連接字符串可以連接到它:

jdbc:odbc:northwind 
+0

工作就像一個魅力。非常感謝! – 2011-02-16 13:56:01

+0

也適用於[h2數據庫鏈接表](http://www.h2database.com/html/grammar.html#create_linked_table)。 – transistor1 2012-12-04 15:08:51

1

我也有這個問題,並嘗試過男人y這裏和各種論壇的建議。最後,我從一個地方發現了一個導致成功連接的片段,並解釋了爲什麼很多這些帖子不起作用。請參閱http://www.coderanch.com/t/295299/JDBC/databases/jdbc-odbc-DSN-connection-MS

問題是在odbc末尾冒號後面必須有一個分號,如在jdbc中:odbc:; Driver =。在閱讀JdbcOdbc橋接器上的Oracle文檔後,說明語法爲jdbc:odbc:dsn;屬性.......由於我們不提供DSN,所以我們需要結束;在添加屬性之前。

我顯示我用不同的連接字符串跑了Windows 7旗艦版32位機器上測試以下:

 driver= (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 
     //jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ= does lookup to ODBC.ini to find matching driver 


      try { 
      connstr= "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn= DriverManager.getConnection(connstr, "", ""); 
      stmt= conn.createStatement(); 
     } 
     catch (Exception e){} 
     try { 
      connstr= "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn1= DriverManager.getConnection(connstr, "", ""); 
      stmt1= conn1.createStatement(); 
      dbmeta1=conn1.getMetaData(); 
     } 
     catch (Exception e){} 
     try { 
      connstr= "jdbc:odbc:MS Access Database;DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn2= DriverManager.getConnection(connstr, "", ""); 
      stmt2= conn2.createStatement(); 
      dbmeta2=conn2.getMetaData(); 
     } 
     catch (Exception e){} 
     try { 
      connstr= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn3= DriverManager.getConnection(connstr, "", ""); 
      stmt3= conn3.createStatement(); 
      dbmeta3=conn3.getMetaData(); 
     } 
     catch (Exception e){} 

stmt1和stmt3是空的,因爲連接是空。 stmt和stmt2工作。 stmt2使用我在IBM Tivoli的文檔中找到的連接字符串。它的工作原理是因爲「MS Access數據庫」是ODBC註冊表中作爲我的計算機上的用戶DSN的有效標題。