#ms-access #jdbc #ucanaccess
#ms-access #jdbc #ucanaccess
Вопрос:
При использовании Java 7 я подключался к MS Access с помощью моста JDBC-ODBC, но теперь я использую 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.Исключение UcanaccessSQLException: UCAExc::: 3.0.6 CryptCodecOpener
Кто-нибудь может мне помочь и дать мне совет?
Ответ №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. Спасибо Томпсону за вашу помощь. Теперь проблема решена с помощью вашего совета.
Ответ №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.
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();
}
}