netBeans 和 ucanacces sql 异常仅从代码调用数据库
netBeans and ucanacces sql exception only calling db from code
好吧,这有点奇怪,我成功安装了驱动程序,并且在服务选项卡中,我的数据库表正确显示,但是当我从代码调用驱动程序时,我得到:
java.sql.SQLException: No suitable driver found for jdbc:ucanaccess://C:\Users\sample.mdb
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at sampleProject.TestDBConnection.main(TestDBConnection.java:16)
这是我的代码:
package sample;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestDBConnection {
public static void main(String[] args) {
try
{
// Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
System.out.println("sample.mdb");
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:\Users\sample.mdb");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT * FROM tableSample");
while(rs.next())
System.out.println(rs.getString("RunnersSample") );
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
有人知道为什么我不能从代码访问吗?
提前致谢!
尝试在路径前使用双斜杠 (//),在路径前使用单斜杠 (/),如下所示:
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:/Users/sample.mdb");
出于某种原因,您可能使用了与当前发行版不同的 ucanaccess.jar(可能是从源代码构建的):
在这个 jar 中必须有 META-INF/services/java.sql.Driver 文件。
此外,JDK 必须是 JDK 至少 Java 6.
编辑:
异常是明确的:驱动程序未注册。
有一次,在 java 6 之前,您必须调用 Class.forName 才能注册驱动程序,因此会依次调用驱动程序 class 的静态块初始化程序,从而注册驱动程序。
从java 6开始,你就不用再做了,因为别人帮你做了。但是驱动程序必须通过合同在文件 META-INF/services/java.sql.Driver 的内容中指定驱动程序的名称 class (解压缩 ucanaccess.jar 以确保此文件存在并且它的内容是正确的)。在 NetBeans 服务中,如果驱动程序不兼容,NetBeans 可能会调用 Class.forName 来与旧驱动程序兼容。请注意 META-INF/services/java.sql.Driver 已经放入 ucanacess 2.0.4.1 中(但这是一个非常旧的版本!)所以也许您使用的 jar 与发行版中的不同。
特别是,如果没有 META-INF/services/java.sql.Driver 文件,则表示您的 ucanaccess.jar 不是 sourceforge 发行版的文件。
编辑 2:显然,即使您配置了 ucanaccess,您也必须始终将 ucanaccess.jar 和四个依赖项 jar(hsqldb、jackcess、commons-lang 和 commons-logging)导入到您的 NetBeans 项目库中作为服务。
这是我以上考虑的假设。
好吧,这有点奇怪,我成功安装了驱动程序,并且在服务选项卡中,我的数据库表正确显示,但是当我从代码调用驱动程序时,我得到:
java.sql.SQLException: No suitable driver found for jdbc:ucanaccess://C:\Users\sample.mdb
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at sampleProject.TestDBConnection.main(TestDBConnection.java:16)
这是我的代码:
package sample;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestDBConnection {
public static void main(String[] args) {
try
{
// Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
System.out.println("sample.mdb");
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:\Users\sample.mdb");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT * FROM tableSample");
while(rs.next())
System.out.println(rs.getString("RunnersSample") );
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
有人知道为什么我不能从代码访问吗? 提前致谢!
尝试在路径前使用双斜杠 (//),在路径前使用单斜杠 (/),如下所示:
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:/Users/sample.mdb");
出于某种原因,您可能使用了与当前发行版不同的 ucanaccess.jar(可能是从源代码构建的): 在这个 jar 中必须有 META-INF/services/java.sql.Driver 文件。 此外,JDK 必须是 JDK 至少 Java 6.
编辑:
异常是明确的:驱动程序未注册。
有一次,在 java 6 之前,您必须调用 Class.forName 才能注册驱动程序,因此会依次调用驱动程序 class 的静态块初始化程序,从而注册驱动程序。
从java 6开始,你就不用再做了,因为别人帮你做了。但是驱动程序必须通过合同在文件 META-INF/services/java.sql.Driver 的内容中指定驱动程序的名称 class (解压缩 ucanaccess.jar 以确保此文件存在并且它的内容是正确的)。在 NetBeans 服务中,如果驱动程序不兼容,NetBeans 可能会调用 Class.forName 来与旧驱动程序兼容。请注意 META-INF/services/java.sql.Driver 已经放入 ucanacess 2.0.4.1 中(但这是一个非常旧的版本!)所以也许您使用的 jar 与发行版中的不同。
特别是,如果没有 META-INF/services/java.sql.Driver 文件,则表示您的 ucanaccess.jar 不是 sourceforge 发行版的文件。
编辑 2:显然,即使您配置了 ucanaccess,您也必须始终将 ucanaccess.jar 和四个依赖项 jar(hsqldb、jackcess、commons-lang 和 commons-logging)导入到您的 NetBeans 项目库中作为服务。 这是我以上考虑的假设。