UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener

Posted

技术标签:

【中文标题】UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener【英文标题】: 【发布时间】:2016-10-06 06:55:14 【问题描述】:

在使用 Java 7 时,我曾经使用 JDBC-ODBC 桥连接到 MS Access,但现在我将 Java 8 与 UCanAccess 一起使用,并且遇到了一些问题。我有 2 节课:

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

    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);
        
    
    
    
    
    
    

两个类都在同一个包中,但是当我尝试运行它时,出现以下错误:

net.ucanaccess.jdbc.

谁能帮助我并给我建议?

【问题讨论】:

【参考方案1】:

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

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

不完整。你需要使用

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

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

【讨论】:

感谢汤普森的帮助。问题现已在您的建议下得到解决。【参考方案2】:

最后我通过安装解决了: 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();
        
      

【讨论】:

以上是关于UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener的主要内容,如果未能解决你的问题,请参考以下文章

当列名包含撇号时出现“UcanaccessSQLException:意外标记”

Android Studio:net.ucanaccess.jdbc.UcanaccessSQLException:错误文件不存在

UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener

net.ucanaccess.jdbc.UcanaccessSQLException 游标状态无效

jdbc ucanaccesssqlexception ucaexc ::: 4.0 4 意外令牌:DOCTOR

如何禁用连接检查约束