问题一:[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
一看到这个dns,就知道跟ODBC数据源有关系。但是我这里安装了Access驱动,配置了ODBC数据源,为什么还报错呢?就这问题,折腾了好几台机器,最后得出的结果就是:
1、先查看操作系统位数,然后根据位数和本地Access版本安装Access驱动;
2、然后以“管理员身份运行”C:\Windows\SysWOW64\odbcad32.exe(一定要用这种方式去看,要是没有odbcad32.exe文件,就换别的方式吧),在弹出的“ODBC数据源管理器”框中切换到“系统驱动”选项卡,在里面找“Microsoft Access Driver”,看看里面有的驱动到底是只支持mdb,还是既支持mdb有支持accdb,要是只有“Microsoft Access Driver(*.mdb)”,那咱们还是把Access数据库建成mdb结尾的然后用mdb数据库来创建ODBC数据源,即便是accdb的也先转成mdb的再配置成数据源。要是有“Microsoft Access Driver(*.mdb,*.accdb)”,那Access数据库就没有要求了,选驱动的时候选这个,数据库哪个都行。
这样子之后,ODBC数据源的配置基本上是没有问题了。
问题二:执行insertSQL时报错:Driver does not support this function
执行代码是这样子的:
stmt = getConnect(db).prepareStatement(sql);
rs = stmt.executeUpdate(sql);//执行SQL
其中的sql是insert SQL语句,单独拿出来可以执行,没有问题。但是一用上面的代码执行就报错。
估计眼尖的人已经看出问题来了,是这个代码有问题。
第一行代码中已经将sql放到prepareStatement里面去了,后面执行的时候又放一遍,自然要报错了,所以只需要改成:
stmt = getConnect(db).prepareStatement(sql);
rs = stmt.executeUpdate();//执行SQL
也就是去掉executeUpdate中的sql就OK啦。
问题三:[Microsoft][ODBC Microsoft Access Driver] 无效的括号名称 '[1476.1950000000002]'。
这个问题是在insert数据的时候发生的,写的SQL很简单:
insert into table1(field2,field3,field4) values("1","2","3");
看到SQL并熟悉Access的人应该就知道问题所在了,Access里面的insert语句只能用单引号不能用双引号,但我这个外行不了解这个规则,所以就出现上面的问题了。所以变成单引号就OK了。
insert into table1(field2,field3,field4) values(‘1’,‘2’,‘3’);
问题四:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
异常如下:
java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3073)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at com.tsp.connection.DBConnection.(DBConnection.java:25)
at com.tsp.connection.DBConnection.main(DBConnection.java:87)
这个问题是在使用java驱动链接Access时触发的,链接代码如下:
static String dbPath =new File("").getAbsolutePath()+File.separator+"database"+File.separator+"reckon.accdb";
//直接用驱动连接Access数据库
String conn="jdbc:odbc:driver={Microsoft Access Driver(*.mdb,*.accdb)};DBQ=";
/**
* 该方法用来连接数据库
* @param db:
* 当使用ODBC数据源的方式连接Access时,db为数据源名称
* 当使用驱动连接Access时,db为数据库所在目录(目前用的是驱动连接)
* */
private DBConnection(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//注册驱动
//Access中的数据库默认编码为GBK,本地项目为UTF-8,若不转码会出现乱码
Properties p = new Properties();
p.put("charSet", "GBK");
connect = DriverManager.getConnection(conn+dbPath,p);
}catch(Exception e){
e.printStackTrace();
}
}
上面的代码看起来没有任何问题,但是一执行一定报错,因为问题所在很隐晦,解决方法如下:
(以上图片的内容来自:http://bbs.csdn.net/topics/370210823)
因此,只需要改掉连接字符串就OK啦,改成:
String conn="jdbc:odbc:driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=";
也就是在Driver与(之间添加空格,*.mdb,与*.accdb之间添加一个空格即可。