在 Java 中为 MS Access 创建无 DSN 连接

Posted

技术标签:

【中文标题】在 Java 中为 MS Access 创建无 DSN 连接【英文标题】:Creating a DSN-less connection for MS Access within Java 【发布时间】:2011-02-16 13:01:31 【问题描述】:

我正在构建一个需要与 MS Access 数据库通信的桌面应用程序。现在,除非我想在每台要使用桌面应用程序的计算机上为数据库注册 DSN,否则我需要一种以无 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 连接实现我所要求的方法,我会很乐意倾听!

【问题讨论】:

【参考方案1】:

JDBC 连接字符串应该以jdbc: 开头,例如:

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

那就试试吧:

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

如果您配置了 DSN,那么您可以使用更简单的连接字符串连接到它:jdbc:odbc:[alias],例如:

jdbc:odbc:northwind

【讨论】:

工作就像一个魅力。非常感谢! 也曾为h2 database linked tables工作。【参考方案2】:

我也遇到了这个问题,并在这里和各种论坛上尝试了许多建议。最后,我从一个地方发现了一个可以成功连接的 sn-p,并解释了为什么其中许多帖子不起作用。见http://www.coderanch.com/t/295299/JDBC/databases/jdbc-odbc-DSN-connection-MS

问题是 odbc 末尾的冒号后面必须有一个分号,如 jdbc:odbc:;Driver= 。在阅读了 JdbcOdbc 桥上的 Oracle 文档后,这是有道理的,该文档指出语法是 jdbc:odbc:dsn; attributes....... 由于我们不提供 DSN,所以我们需要以 ; 结尾在添加属性之前。

我在下面显示了我在 Windows 7 Ultimate 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 Database”是 ODBC 注册表中的一个有效标题,作为我计算机上的用户 DSN。

【讨论】:

谢谢!我很沮丧,正在寻找合适的连接字符串。第三个对我有用。

以上是关于在 Java 中为 MS Access 创建无 DSN 连接的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2016 VBA 在组合查询条件中为空

MS Access - 通配符加入与无加入过滤

使用 Java Ucanaccess 在 ms-Access 中恢复数据和存储的查询

MS Access 中的临时表

通过电子邮件发送 PDF 报告时触发 MS Access 宏

通过 VBA 在 MS Access 中自动链接/刷新 ODBC 链接表