整理下思路,包括出现的问题及解决方案
Java连接Access的方法
1 ODBC桥接方法,就是在控制面板“ODBC数据源(32位或64位)”那里设置DSN,百度一下,一大堆设置方法,以及什么wow64下设置兼容32位之类的东西,这里设置的数据源名称acc,连接到D盘c.accdb数据库。
主要代码:String url ="jdbc:odbc:acc";
2直接连接access不使用ODBC数据源,这个就是直接写代码
主要代码:String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb,*.accdb)};DBQ=d:\\c.accdb";
全部代码:
环境(失败):
系统:win8 X64
Myeclips10 (自带JDK)
Access2010 X86
不管哪种方法都是一直不成功
总是提示:[ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序,或是其他的错误
网上很多都在解释ODBC方式,是因为64位操作系统和32位Access的原因,然后出现了要找到wow64下的ODBC,然后设置,这些我也都试过了,也不成功。最后根据一位网友提示,找到了一篇微软的文章:http://msdn.microsoft.com/zh-cn/library/ff965871.aspx#DataProgrammingWithAccess2010_JDBCODBCExample
在下面的:使用32位和64位的ACE提供程序那里给出了详细解释
仅64位的解决方案(64位的Access、64位的Windows)
若要实现64位的解决方案,您必须执行以下操作:
1.在64位的Windows上部署64位的Access2010
2.构建自定义的64位数据访问应用程序
仅32位的解决方案(32位的Access、32位的Windows)
如果您有32位的应用程序,希望通过Access 2010继续运行它而不进行更改,则必须安装32位版本的Access 2010。
32位Access 2010的工作方式与32位Access 2007完全一样,无需对VBA代码、COM加载项或ActiveX控件进行更改即可继续运行。
WOW64解决方案(32位的Access、64位的Windows)
WOW64技术允许在Windows 64位的平台上执行32位的应用程序。可以将32位的Access 2010安装在64位的Windows上。在这种情况下,您的数据应用程序必须是32位才能与ACE提供程序通信。这是64位Windows操作系统上的默认安装,可提供与32位Office应用程序的兼容性。
尽管32位的应用程序能够以透明方式运行,但是不支持在同一进程中混合使用两种类型的代码。64位的应用程序不能针对32位的系统库(DLL)进行链接,同样32位的应用程序也不能针对64位的系统库进行链接
也就是说如果你的系统是64位的,不管是win7,win8,如果Access是32位的,那么你的myeclips、JDK也必须是32位的(我是这么理解的)
早就忘了自己装的是多少位的了,System.out.println(System.getProperty("sun.arch.data.model"));
测试是64位的,随后在重装的问题上,我选择了重装office,重装了64位office,一切问题迎刃而解,不管是ODBC去连接还是直接连接,都成功
所以现在的环境是
系统win8 X64 myeclips10 X64 Access2010 X64
另外两种环境没有去测试
就是win8 X 64 myeclips10 32位JDK 32位Access2010 X86
或者全是32位的
全部代码:import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class conn1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
try{
Class.forName(driver);
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=d:\\c.accdb";
//String url ="jdbc:odbc:acc";
Connection con = DriverManager.getConnection(url);
if(!con.isClosed()){
System.out.print("连接成功!");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}
}