UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener

Во время использования Java 7 я использовал для подключения к MS Access с помощью моста JDBC-ODBC, но теперь я использую 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);
        }
    
    
    }
    
    }
    

Оба класса находятся в одинаковых пакетах, но когда я пытаюсь запустить его, появляется следующая ошибка:

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

Может ли кто-нибудь помочь мне и дать мне совет?

2 ответа

Решение

jackcessOpener Параметр требует полного имени класса, который реализует JackcessOpenerInterface, даже если этот класс находится в том же пакете, что и класс, который его вызывает. Так что ваше соединение URL

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

является неполным. Вам нужно использовать

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

Также имейте в виду, что у вас может быть недостаточно прав для работы с файлом базы данных, если он хранится в корневой папке системного диска (C:\). Вы действительно должны переместить файл базы данных в другое место, где вы можете быть уверены, что у вас будет полный доступ на чтение / запись.

Наконец, я решил установить: 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.

Maven:

       <!-- 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();
        }
      }
Другие вопросы по тегам