如何将 UCanAccess 连接到使用数据库密码加密的 Access 数据库?

How to connect UCanAccess to an Access database encrypted with a database password?

我已经开发了一个 Java 应用程序(字典),它带有一个 Access 数据库来存储字典中的单词,我正准备分发它。 我想用密码加密我的数据库,以防止人们访问我的话。 当我设置密码时,Java 代码显示此异常

net.ucanaccess.jdbc.UcanaccessSQLException: Decoding not supported.  Please choose a CodecProvider which supports reading the current database encoding.
at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:247)

这是我使用密码加密数据库之前的连接代码....

String s1="jdbc:ucanaccess://";
String user="";
String pass="";
String s4="words.accdb";

public void connectToDB(){
        //database connection
        try {
            conn = DriverManager.getConnection(s1+s4,user,pass);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //end of database connection
    }

这里是密码加密后的代码例如12345...

String s1="jdbc:ucanaccess://";
String user="";
String pass="12345";
String s4="words.accdb";

public void connectToDB(){
        //database connection
        try {
            conn = DriverManager.getConnection(s1+s4,user,pass);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //end of database connection
    }

您对 jdbc 驱动程序 (s1) 的 Link 似乎无效。

看看我从 this Site

用谷歌搜索时发现的模式
 String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\IJTS EXAMPLES\Database11.accdb;PWD=1234";

这是来自 a Site

的示例
private void initializeConnection()
{

Connection con ;
try
{

// Load Class Definition for Database Driver
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

// set this to a MS Access DB you have on your machine
String curDir = System.getProperty("user.dir");
String filename = curDir +"/test.mdb";

String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\test.mdb;READONLY=true";

// Get connection from the DriverManager
con = DriverManager.getConnection( database,"Admin","test" );


} catch (Exception e) {

System.out.println("Database Connection Problem");

}

}

请注意,您必须通过用您的凭据替换部分来更改字符串

我假设您已经从 MSAccess 中设置了数据库密码,并对其进行了加密。

要连接到这种类型的数据库,您需要正确的连接字符串并通过 odbc 连接。

这里是 link 获取 MSAccess 的连接字符串 https://www.connectionstrings.com/access/

可以在此处找到有关该主题的 post How can I add a password to this JDBC:ODBC connection string that is trying to connect to an MS Access database

我建议您使用不同类型的嵌入式数据库为 java 完成所有这些工作。使用 h2,这是更好的纯 java 解决方案

http://www.h2database.com/html/main.html

代码示例

public class HelloWorld {

    /**
     * Called when ran from command line.
     *
     * @param args ignored
     */
    public static void main(String... args) throws Exception {
        // delete the database named 'test' in the user home directory
        DeleteDbFiles.execute("~", "test", true);

        Class.forName("org.h2.Driver");
        Connection conn = DriverManager.getConnection("jdbc:h2:~/test");
        Statement stat = conn.createStatement();    
        stat.execute("create table test(id int primary key, name varchar(255))");
        stat.execute("insert into test values(1, 'Hello')");
        ResultSet rs;
        rs = stat.executeQuery("select * from test");
        while (rs.next()) {
            System.out.println(rs.getString("name"));
        }
        stat.close();
        conn.close();
    }    
}

数据库文件存储在哪里?

使用数据库URL时,如jdbc:h2:~/test,数据库存放在用户目录下。对于 Windows,这通常是 C:\Documents and Settings\ 或 C:\Users\。

如果未设置基本目录(如jdbc:h2:test),数据库文件将存储在应用程序启动的目录(当前工作目录)中。

从开始菜单使用 H2 控制台应用程序时,这是 /bin。基本目录可以在数据库中设置URL。可以使用固定路径或相对路径。

当使用URL jdbc:h2:file:data/sample时,数据库存放在data目录下(相对于当前工作目录)。如果该目录尚不存在,则会自动创建该目录。

也可以使用完全限定的目录名称(对于 Windows,驱动器名称)。示例:jdbc:h2:文件:C:/data/test

在URL

中传递用户名and/or密码

而不是像在中那样将用户名作为单独的参数传递 Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", "123");

用户名(and/or 密码)可以在 URL 本身中提供:Connection conn = DriverManager. getConnection("jdbc:h2:~/test;USER=sa;PASSWORD=123");

UCanaccess 通过依赖项注入模式支持加密。

-您必须将 jackcess-encrypt 和所有相关依赖项添加到您的项目中

-您必须按照 ucanaccess 网站

中的建议编写 class 实现 net.ucanaccess.jdbc.JackcessOpenerInterface

-你必须在jdbcurl中传递上面class的名字: 如果您将实现命名为 class com.pippo.Bingo 那么你必须以这种方式构建 jdbc url:

DriverManager.getConnection("jdbc:ucanaccess://c:/db/your_db_name.mdb;jackcessOpener=com.pippo.Bingo", "sa", pwd);

如何将 UCanAccess 连接到使用数据库密码加密的 Access 数据库的步骤

第 1 步:
将这两个包添加到您的项目中 (jackcess-encrypt.jar, bcprov-ext-jdk15on-152)

您可以从以下链接下载这两个包:

Jackcess Encrypt
Bouncy Castle

第 2 步:
您必须将此 class 添加到您的项目文件夹

import java.io.File;
import java.io.IOException;
import net.ucanaccess.jdbc.JackcessOpenerInterface;
import com.healthmarketscience.jackcess.CryptCodecProvider;
import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;

public class CryptCodecOpener implements JackcessOpenerInterface {
         @Override
    public Database open(File fl,String pwd) throws IOException {
       DatabaseBuilder dbd =new DatabaseBuilder(fl);
       dbd.setAutoSync(false);
       dbd.setCodecProvider(new CryptCodecProvider(pwd));
       dbd.setReadOnly(false);
       return dbd.open();
    }
  //Notice that the parameter setting autosync =true is recommended with UCanAccess for performance reasons. 
  //UCanAccess flushes the updates to disk at transaction end. 
  //For more details about autosync parameter (and related tradeoff), see the Jackcess documentation. 
}

像这样

第 3 步:
使用以下连接代码

public void connectToDB(){
            try {
                conn = DriverManager.getConnection("jdbc:ucanaccess://words.accdb;jackcessOpener=CryptCodecOpener", "user", "pass");
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
    }


您还可以观看此视频...https://www.youtube.com/watch?v=TT6MgBBkRSE