UcanaccessSQLException: UCAExc::3.0.6 CryptCodecOpener
UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener
在使用 Java 7 时,我曾经使用 JDBC-ODBC 桥连接到 MS Access,但现在我使用 Java 8 和 UCanAccess 并且我正在运行宁陷入一些问题。我有 2 classes:
CryptCodecOpener class
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();
}
}
和
Java应用程序 1 class
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);
}
}
}
两个 class 都在同一个包中,但是当我尝试 运行 它时,出现以下错误:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener
谁能帮助我并给我建议?
jackcessOpener
参数需要实现 JackcessOpenerInterface
的 class 的完全限定名称,即使 class 与 [=] 在同一个包中22=] 调用它。所以你的连接 URL
String dbURL = "jdbc:ucanaccess://C:\test.accdb;jackcessOpener=CryptCodecOpener";
不完整。你需要使用
String dbURL = "jdbc:ucanaccess://C:\test.accdb;jackcessOpener=javaapplication1.CryptCodecOpener";
此外,请注意,如果数据库文件存储在系统驱动器 (C:\
) 的根文件夹中,您可能没有足够的权限来使用它。您真的应该将数据库文件移动到另一个位置,您可以确保您拥有完全的 read/write 访问权限。
最后我通过安装解决了:
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();
}
}
在使用 Java 7 时,我曾经使用 JDBC-ODBC 桥连接到 MS Access,但现在我使用 Java 8 和 UCanAccess 并且我正在运行宁陷入一些问题。我有 2 classes:
CryptCodecOpener class
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(); } }
和
Java应用程序 1 class
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); } } }
两个 class 都在同一个包中,但是当我尝试 运行 它时,出现以下错误:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 CryptCodecOpener
谁能帮助我并给我建议?
jackcessOpener
参数需要实现 JackcessOpenerInterface
的 class 的完全限定名称,即使 class 与 [=] 在同一个包中22=] 调用它。所以你的连接 URL
String dbURL = "jdbc:ucanaccess://C:\test.accdb;jackcessOpener=CryptCodecOpener";
不完整。你需要使用
String dbURL = "jdbc:ucanaccess://C:\test.accdb;jackcessOpener=javaapplication1.CryptCodecOpener";
此外,请注意,如果数据库文件存储在系统驱动器 (C:\
) 的根文件夹中,您可能没有足够的权限来使用它。您真的应该将数据库文件移动到另一个位置,您可以确保您拥有完全的 read/write 访问权限。
最后我通过安装解决了:
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();
}
}