jdbc 连接 Access 乱码解决

来源:互联网 发布:数据库 索引 编辑:程序博客网 时间:2024/06/09 16:38
 
        这两天写一个数据备份的小工具,需要将数据备份到ACCESS数据库,在读写ACCESS数据库时总是出现乱码,这方面的资料网上异常的少,要么是连接方法要么就根本不解决问题的方法!
        知道是字符集的问题,就试了各种字符集的设置都不能成功,只能通过万能的网络寻找强人,终于找到了这片专门论述jdbc操作ACCESS数据库读写乱码问题的博文。
  为了便于以后查阅,也方便其它有同样问题的童鞋,原文整理如下:

    我们知道,java的字符串都是unicode编码的,所以读出的任何字符串都被默认处理为unicode,因此,我们必须将取出来的byte强制转码为gbk,然后java会自动将该gbk编码转为unicode的字符串,输出。

conn = DriverManager.getConnection(
"jdbc:odbc:你的数据库;useUnicode=false;characterEncoding=gbk", "user", "yourpassword");

public String readDB(){
  try {
        sql = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        rs = sql.executeQuery("select * from grdj");
//            System.out.println(System.getProperties());
        int i=1;
        while (rs.next()) {
                   i++;
                  System.out.println(rs.getString(2));
                  System.out.println(new String(rs.getBytes(3),"gbk"));
                  System.out.println(rs.getString(4));
                 System.out.println(new String(rs.getBytes(5),"gbk"));
                 System.out.println(rs.getFloat(6));
                 System.out.println("-----------------");
         }
         System.out.println("all:"+i);
    }catch (UnsupportedEncodingException e) {
          // TODO Auto-generated catch block
         e.printStackTrace();
    }catch (SQLException e) {
         // TODO Auto-generated catch block
        e.printStackTrace();
     }finally{
         try {
              if(rs!=null){ rs.close();}
              if(sql!=null){sql.close();}
              if(conn!=null){conn.close();}
          } catch (SQLException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
    }
    return null;        
}

这是一个简单的示例。

但是insert还是出现乱码,问题我估计还是因为流得原因。

因此,必须采用DriverManager.getConnection()的第三种参数法
DriverManager.getConnection(url,Properties);
首先,设定当前流的默认字符集,这是一个持久的对象:
Properties prop = new Properties(); 
prop.put("charSet", "gbk");
然后如果数据库有密码,我们必须把用户名和密码的prop写完整
prop.put("user", "user");
prop.put("password", "yourpassword");

然后写url:"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + “你的mdb文件路径”
之后不管是读数据库还是写数据库,都不用再做任何的编码转换就可以进行了。
连接数据库完整语句示例:

conn =  DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
"E:/My Archives/Dry Clean data bak/ganxi/prodata.mdb",prop);

OK下来就正常连接select update insert吧!问题完美解决!感谢lindily!
原文出处:http://hi.baidu.com/lindily/blog/item/b1f5003316fa36f11b4cff3a.html