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

时间:2011-02-16 13:01:32

标签: ms-access jdbc odbc dsn

我正在构建一个需要与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连接实现我的要求,我会很乐意听取它!

2 个答案:

答案 0 :(得分:5)

JDBC连接字符串shouls以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

答案 1 :(得分:1)

我也有这个问题,并在各种论坛上尝试了很多建议。最后,我发现一个地方的片段导致成功连接,并解释了为什么这些帖子中的许多都不起作用。见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 Ultimate 32bit计算机上使用不同连接字符串运行的测试下面显示:

        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。