ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java连接access的用户名、密码异常Decoding not supported解决

2019-10-09 12:56:46  阅读:507  来源: 互联网

标签:accdb return String supported Decoding new java public dbURL


Java通过ucanaccessAccess数据库.accdb文件连接:

public static Connection getConn() {
     try {
         String dbURL = "jdbc:ucanaccess://" +
             "C:\\Users\\f1334185\\Documents\\数据库4.accdb";
         return DriverManager.getConnection(dbURL);
     } catch (Exception e) {
         System.out.println("AccessDB connection fail");
         e.printStackTrace();
     }
     return null;
 }

.accdb文件没设置密码时,可以正常访问:

@Autowired
private ObjectMapper objectMapper;
@Test
public void contextLoads() throws SQLException, JsonProcessingException {
    Connection conn = dbUtil.getConn();
    Statement statement = conn.createStatement();
    ResultSet resultSet = statement.executeQuery("select * from tb_user");

    ResultSetMetaData metaData = resultSet.getMetaData();
    int columnCount = metaData.getColumnCount();
    List<Map<String, Object>> list = new ArrayList<>();
    while (resultSet.next()){
        Map<String, Object> map = new HashMap<>();
        for (int i = 0; i < columnCount; i++) {
            String columnName = metaData.getColumnName(i + 1);
            Object object = resultSet.getObject(columnCount);
            map.put(columnName, object);
        }
        list.add(map);
    }
    System.out.println(objectMapper.writeValueAsString(list));
}

加密.accdb文件后,在代码设置用户名,密码:

public static Connection getConn() {
    try {
        String dbURL = "jdbc:ucanaccess://" +
            "C:\\Users\\f1334185\\Documents\\数据库4.accdb";
        return DriverManager.getConnection(dbURL, "aa", "aa");
    } catch (Exception e) {
        System.out.println("AccessDB connection fail");
        e.printStackTrace();
    }
    return null;
}

再次访问,会错误抛出异常:

UCAExc:::4.0.4 Decoding not supported.  Please choose a CodecProvider which supports reading the current database encoding.

通过官方文档UCanAccess看到

要打开加密的.accdb文件,还需要jackcess-encrypt依赖。所有添加依赖:

<dependency>
    <groupId>com.healthmarketscience.jackcess</groupId>
    <artifactId>jackcess-encrypt</artifactId>
    <version>2.1.4</version>
</dependency>

程序运行,还是抛同样错误。再通过文档、Google搜索等发现,还需要新建类:

public class JackcessOpener implements JackcessOpenerInterface {
    @Override
    public Database open(File file, String s) throws IOException {
        DatabaseBuilder builder = new DatabaseBuilder(file);
        builder.setAutoSync(false);
        builder.setCodecProvider(new CryptCodecProvider(s));
        builder.setReadOnly(false);
        return builder.open();
    }
}

但该类却没说明怎么去使用,没办法,只能看源码了,最终发现:

可看到,如果有该Keyjackcessopener的,便通过该keyvalue反射获取实例。所以,修改获取连接 :

public static Connection getConn() {
    try {
        String dbURL = "jdbc:ucanaccess://" +
            "C:\\Users\\f1334185\\Documents\\数据库4.accdb";
        Properties pro = new Properties();
        pro.put("user", "aa");
        pro.put("password", "aa");
        pro.put("jackcessopener", "com.example.demo.JackcessOpener");
        return DriverManager.getConnection(dbURL, pro);
    } catch (Exception e) {
        System.out.println("AccessDB connection fail");
        e.printStackTrace();
    }
    return null;
}

运行程序,不再报错,并获取的数据。

标签:accdb,return,String,supported,Decoding,new,java,public,dbURL
来源: https://www.cnblogs.com/zenghi-home/p/11641050.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有