如何将UCanAccess连接到使用数据库密码加密的Access数据库?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将UCanAccess连接到使用数据库密码加密的Access数据库?相关的知识,希望对你有一定的参考价值。
我开发了一个带有Access数据库的Java应用程序(字典)来存储字典的单词,我正准备发布它。我想用密码加密我的数据库,以防止人们访问我的文字。当我设置密码时,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
}
步骤如何将UCanAccess连接到使用数据库密码加密的Access数据库
步骤1: 将这两个包添加到您的项目中(jackcess-encrypt.jar,bcprov-ext-jdk15on-152)
您可以从以下链接下载这两个包:
Jackcess Encrypt Bouncy Castle
第2步: 您必须将此类添加到项目文件夹中
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
UCanaccess通过依赖注入模式支持加密。
- 您必须将jackcess-encrypt和所有相关的依赖项添加到您的项目中
- 你必须按照ucanaccess网站的建议编写一个实现net.ucanaccess.jdbc.JackcessOpenerInterface
的类
- 您必须在jdbc url中传递上述类的名称:如果您将实现类命名为com.pippo.Bingo
,那么您必须以这种方式构建jdbc url:
DriverManager.getConnection("jdbc:ucanaccess://c:/db/your_db_name.mdb;jackcessOpener=com.pippo.Bingo", "sa", pwd);
您的jdbc驱动程序链接(s1)似乎无效。
看看我从this Site谷歌搜索时发现的模式
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:IJTS EXAMPLESDatabase11.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: est.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连接。
这是获取MS Access qazxsw poi的连接字符串的链接
关于这个问题的好帖子可以在这里找到https://www.connectionstrings.com/access/
我建议你使用不同类型的嵌入式数据库为java做所有这些。使用h2,这是更好的纯java解决方案
代码示例
http://www.h2database.com/html/main.html
存储的数据库文件在哪里?
使用jdbc:h2:〜/ test等数据库URL时,数据库存储在用户目录中。对于Windows,这通常是C: Documents and Settings 或C: Users 。
如果未设置基目录(如在jdbc:h2:test中),则数据库文件存储在启动应用程序的目录(当前工作目录)中。
从开始菜单使用H2控制台应用程序时,这是/ bin。可以在数据库URL中设置基目录。可以使用固定或相对路径。
使用URL jdbc:h2:file:data / sample时,数据库存储在目录数据中(相对于当前工作目录)。如果目录尚不存在,则会自动创建该目录。
也可以使用完全限定的目录名称(对于Windows,驱动器名称)。示例:jdbc:h2:file:C:/ data / test
在URL中传递用户名和/或密码
而不是像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本身中提供:Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", "123");
以上是关于如何将UCanAccess连接到使用数据库密码加密的Access数据库?的主要内容,如果未能解决你的问题,请参考以下文章
不使用 UCanAccess 从 Java 8 连接到 Access 数据库
使用 UCanAccess 连接到数据库时出现“无效页码 1”错误
UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库
Spring Boot / Data 通过 jdbc UCanAccess 连接到 MS Access