我也遇到了这个问题,并在这里和各种论坛上尝试了许多建议。最后,我从一个地方发现了一个片段,它导致成功连接,并解释了为什么其中许多帖子不起作用。请参阅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。