Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将UCanAccess连接到使用数据库密码加密的Access数据库?_Java_Ms Access_Jdbc_Ms Access 2010_Ucanaccess - Fatal编程技术网

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

Java 如何将UCanAccess连接到使用数据库密码加密的Access数据库?,java,ms-access,jdbc,ms-access-2010,ucanaccess,Java,Ms Access,Jdbc,Ms Access 2010,Ucanaccess,我已经开发了一个Java应用程序(字典),它带有一个Access数据库来存储字典中的单词,我正准备分发它。 我想用密码加密我的数据库,以防止人们访问我的文字。 当我设置密码时,Java代码显示这个异常 net.ucanaccess.jdbc.UcanaccessSQLException: Decoding not supported. Please choose a CodecProvider which supports reading the current database encodi

我已经开发了一个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)的链接似乎无效

看看我在谷歌搜索时发现的图案

这是一个来自中国的样品


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

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

要连接到此类型的数据库,您需要正确的连接字符串并通过odbc进行连接

下面是获取MSAccess连接字符串的链接

关于这个主题的好帖子可以在这里找到

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

代码示例

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();
    }    
}
数据库文件存储在哪里?

当使用像jdbc:h2:~/test这样的数据库URL时,数据库存储在用户目录中。对于Windows,这通常是C:\Documents and Settings\或C:\Users\

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

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

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

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

在URL中传递用户名和/或密码

而不是像中那样将用户名作为单独的参数传递
Connection conn=DriverManager。getConnection(“jdbc:h2:~/test”、“sa”、“123”)


可以在URL本身中提供用户名(和/或密码):
Connection conn=DriverManager。getConnection(“jdbc:h2:~/test;USER=sa;PASSWORD=123”)

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

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

-您必须按照ucanaccess网站中的建议编写一个实现
net.ucanaccess.jdbc.jackcessOpenerface
的类

-您必须在jdbc url中传递上述类的名称: 如果您将实现类命名为
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)

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


第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();
            }
    }


您也可以观看此视频…

没有我的链接有效,没有密码也可以正常工作。我如何使用ucanaccess编写数据库连接语句??因为jdbc:odbc桥已经从jre8中删除了,如果删除了,为什么还要使用MSAccess?你能告诉我们你不能使用纯java解决方案的原因吗?你为什么还需要MSAccess?使用H2我不知道使用它:)我可以帮你使用它。。。请给我一点时间为您编写代码谢谢亲爱的,我知道您的答案是正确的,但是我应该在实现JackcessOpenerInterface接口的类中编写什么,或者何时调用位于JackcesOpenerinterface接口内的open方法请解释更多。。。。。。。因为有太多人有同样的问题,我想帮助你。您只需复制实现ucanaccess网站中显示的JackcessOpenerface的类,更改其名称,并在jdbc url中传递所选(完整)名称,例如jdbc:ucanaccess://c:/db/your_db_name.mdb;jackcessOpener=com.plete.Name;UCanAccess将调用open方法。另请参见我在UCanAccess论坛上的回答(sourceforge将最新推出时),现在它在线程“main”java.lang.NoClassDefFoundError中显示此异常
异常:org/bouncycastle/crypto/InvalidCipherTextException,网址为com.healthmarketscience.jackcess.CryptocodeProvider.createHandler(cryptocodeprovider.java:114)
从open方法中的returne
return dbd.open();
谢谢我找到了解决方案,我们必须添加另一个jar文件
http://www.bouncycastle.org/latest_releases.html
非常感谢。。。。。。。。。。。。。。。。。
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. 
}
public void connectToDB(){
            try {
                conn = DriverManager.getConnection("jdbc:ucanaccess://words.accdb;jackcessOpener=CryptCodecOpener", "user", "pass");
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
    }