UcanaccessSQLException:UCAExc ::: 3.0.6 CryptCodecOpener

时间:2016-10-06 06:55:14

标签: ms-access jdbc ucanaccess

使用Java 7时,我曾使用JDBC-ODBC Bridge连接到MS Access,但现在我使用Java 8和UCanAccess,我遇到了一些问题。我有2个班级:

  1. CryptCodecOpener类

    package javaapplication1;
    
    
    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();
    }
    
    }
    
    1. JavaApplication1类

      package javaapplication1;
      import java.sql.*;
      public class JavaApplication1 {
      static Connection con;
      static Statement st;
      static PreparedStatement pst;
      static ResultSet rs;
      
      public static void main(String[] args) 
      {
          // TODO code application logic here
      
          try
          {
              //Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
           String env=System.getenv("ProgramFiles");
           //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
          String dbURL = "jdbc:ucanaccess://C:\\test.accdb;jackcessOpener=CryptCodecOpener";
           //String dbURL = "jdbc:ucanaccess://"+env+"\\RSSBV0\\db\\rssboffdb.accdb";
           //String username="";
           String username=System.getProperty("user.name");
           String password="r$$b231";
           con = DriverManager.getConnection(dbURL,username,password);
           String query = "select username from userstb";
           pst = con.prepareStatement(query);
           rs = null;
      
           try
           {
              rs = pst.executeQuery();
      
              while(rs.next())
              {
                  System.out.println(rs.getString("username"));
              }
           }
           catch (Exception e)
           {
             pst.close();
             con.close();
           }
          }
          catch(Exception e)
          {
              System.out.println(e);
          }
      
      
      }
      
      }
      
    2. 这两个类都在相同的包中,但是当我尝试运行它时,会出现以下错误:

        

      net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 3.0.6 CryptCodecOpener

      任何人都可以帮助我并给我建议吗?

2 个答案:

答案 0 :(得分:1)

jackcessOpener参数需要实现JackcessOpenerInterface的类的完全限定名称,即使该类与调用它的类位于同一个包中。所以你的连接URL

String dbURL = "jdbc:ucanaccess://C:\\test.accdb;jackcessOpener=CryptCodecOpener";

不完整。你需要使用

String dbURL = "jdbc:ucanaccess://C:\\test.accdb;jackcessOpener=javaapplication1.CryptCodecOpener";

另外,请注意,如果数据库文件存储在系统驱动器的根文件夹(C:\)中,则可能没有足够的权限使用该数据库文件。您真的应该将数据库文件移动到另一个可以确保您具有完全读/写访问权限的位置。

答案 1 :(得分:0)

最后我通过安装解决了: UcAnaccess 库版本 4.0.4

如果您使用的是 maven,则可以使用以下内容:

<!-- https://mvnrepository.com/artifact/net.sf.ucanaccess/ucanaccess -->
<dependency>
  <groupId>net.sf.ucanaccess</groupId>
  <artifactId>ucanaccess</artifactId>
  <version>4.0.4</version>
</dependency>

Jackcess 库版本 1.1.10,以及 jackcess-encrypt 库版本 3.0.0。

马文:

 <!-- https://mvnrepository.com/artifact/jackcess/jackcess -->
    <dependency>
      <groupId>jackcess</groupId>
      <artifactId>jackcess</artifactId>
      <version>1.1.10</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.healthmarketscience.jackcess/jackcess-encrypt -->
    <dependency>
      <groupId>com.healthmarketscience.jackcess</groupId>
      <artifactId>jackcess-encrypt</artifactId>
      <version>3.0.0</version>
    </dependency>

尝试java代码:

  public static void tryit() throws SQLException, ClassNotFoundException {

        try {
          Connection conn = DriverManager
              .getConnection("jdbc:ucanaccess://C:\\Users\\aag\\Desktop\\F_B_1.mdb;jackcessOpener=com.floridatrading.mobile_app.mobileapp.manage.CryptCodecOpener");
    
          System.out.println("Successfully");
          conn.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }