使用Access时遇到的问题

问题一:[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语句,单独拿出来可以执行,没有问题。但是一用上面的代码执行就报错。

估计眼尖的人已经看出问题来了,是这个代码有问题。

扫描二维码关注公众号,回复: 722892 查看本文章

第一行代码中已经将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.<init>(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之间添加一个空格即可。

猜你喜欢

转载自1017401036.iteye.com/blog/2261457
今日推荐