2011-02-16 45 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的有效标题。