access 数据库有一个表 data(id 数值, city 文本, title 文本, ......, success 是/否)在程序中读取数据,分析数据,根据分析结果修改当前行的 success 值。但是我发现如果在 Connection.createStatement 中传入了参数 ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE,Statement 就读不到数据了。而如果不带这些参数,则在调用 ResultSet.updateBoolean 会抛出异常。代码如下:
package com.csjl.infopub.gather;import java.sql.*;public class Test { public static void main(String[] args) throws Exception {
String url =
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=E:/Temp/data.mdb;characterEncoding=GBK";
String sql =
" select id, username, password, success from student";
Connection conn = null;
Statement cmd = null;
ResultSet rs = null;
System.out.println("begin");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
java.util.Properties p = new java.util.Properties();
p.put("charSet", "GBK");
conn = DriverManager.getConnection(url, p);
conn.setAutoCommit(true);
// 这样读不到数据
cmd = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// cmd = conn.createStatement(); 这种写法可以读到数据
rs = cmd.executeQuery(sql);
System.out.println("row count = " + rs.getRow());
while(rs.next()){
System.out.println("id = " + rs.getInt("id"));
rs.updateBoolean("Success", true);
rs.updateRow();
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(rs != null){
try{rs.close();}catch(Exception ex){}
}
if(cmd != null){
try{cmd.close();}catch(Exception ex){}
}
if(conn != null){
try{conn.close();}catch(Exception ex){}
}
}
}
}
package com.csjl.infopub.gather;import java.sql.*;public class Test { public static void main(String[] args) throws Exception {
String url =
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=E:/Temp/data.mdb;characterEncoding=GBK";
String sql =
" select id, username, password, success from student";
Connection conn = null;
Statement cmd = null;
ResultSet rs = null;
System.out.println("begin");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
java.util.Properties p = new java.util.Properties();
p.put("charSet", "GBK");
conn = DriverManager.getConnection(url, p);
conn.setAutoCommit(true);
// 这样读不到数据
cmd = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// cmd = conn.createStatement(); 这种写法可以读到数据
rs = cmd.executeQuery(sql);
System.out.println("row count = " + rs.getRow());
while(rs.next()){
System.out.println("id = " + rs.getInt("id"));
rs.updateBoolean("Success", true);
rs.updateRow();
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(rs != null){
try{rs.close();}catch(Exception ex){}
}
if(cmd != null){
try{cmd.close();}catch(Exception ex){}
}
if(conn != null){
try{conn.close();}catch(Exception ex){}
}
}
}
}
用什么不是我能决定得了的事情
写这个程序是要从别的地方把数据导到我的系统里来,我的系统是oracle。对方提供的是 access,并且数据格式和我的差别太大。比如我们的系统中有“价格”字段,类型是number(10,2),而数据源则五花八门,并且都是汉字,可能有10万,一十万,壹拾万,100000,100,000,……。我要做的就是把 access 中的原始数据分析,并且保存到我们规范化的oracle中去。我的做法是依次分析“10万”、“一十万”、……的这种格式,如果成功了,则将源access的success字段设置为true,以免下次重新分析。
10年前曾经用Access帮某大学开发其论坛,当年还是古老的Access2000,想来想去没印象碰到过这种问题。不过当年用的是ASP+ODBC。
但楼主用的也是ODBC,要不试试看能否换个ODBC驱动看看吧。
access 还有别的ODBC驱动?