netBeans 和 ucanacces sql 异常仅从代码中调用 db

Posted

技术标签:

【中文标题】netBeans 和 ucanacces sql 异常仅从代码中调用 db【英文标题】:netBeans and ucanacces sql exception only calling db from code 【发布时间】:2015-03-11 23:37:08 【问题描述】:

嗯,这有点奇怪,我成功安装了驱动程序,在服务选项卡中,我的数据库表显示正确,但是当我从代码中调用驱动程序时,我得到:

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


有人知道为什么我不能访问代码吗? 提前致谢!

【问题讨论】:

【参考方案1】:

由于某种原因,您可能使用了与当前发行版中不同的 ucanaccess.jar(可能是从源代码构建的): 在这个 jar 中必须有 META-INF/services/java.sql.Driver 文件。 此外,JDK 必须是至少 Java 6 的 JDK。

编辑: 异常是明确的:驱动程序未注册。 有一次,在 java 6 之前,您必须调用 Class.forName 才能注册驱动程序,因此会依次调用驱动程序类的静态块初始化程序来注册驱动程序。 从 java 6 开始,您不再需要这样做,因为其他人会为您完成。但驱动程序必须在 META-INF/services/java.sql.Driver 文件的内容中通过合同指定驱动程序类的名称(解压 ucanaccess.jar 以确保该文件存在且其内容正确)。在 NetBeans 服务中,如果驱动程序不兼容,NetBeans 可能会调用 Class.forName 以与旧驱动程序兼容。请注意 META-INF/services/java.sql.Driver 已经放在 ucanaccess 2.0.4.1 中(但这是一个旧版本!)所以也许您使用的 jar 与发行版中的 jar 不同。 特别是,如果没有 META-INF/services/java.sql.Driver 文件,则意味着您的 ucanaccess.jar 不是 sourceforge 发行版的。

编辑 2:显然,即使您将 ucanaccess 配置为服务,您也必须始终将 ucanaccess.jar 和四个依赖项 jar(hsqldb、jackcess、commons-lang 和 commons-logging)导入您的 NetBeans 项目库。 这是我上面考虑的假设。

【讨论】:

感谢您的回答jamadei。我有JDK 8,应该没问题,但是我不明白答案的另一部分,我安装了UCanAccess工具的2.0.4.1版本的jar,按照网站中的所有步骤进行集成这在netbeans上,它在服务选项卡上工作,我不知道我需要从你的回答中做什么,才能让它在代码中工作,你能再解释一下吗?抱歉,我是 netBeans 的菜鸟。谢谢! 希望我上面写的对你有帮助。 对不起,但是没有...我在这里迷路了,与其他数据库相比,旧版本的 java 更容易连接,我不知道如何解决这个问题,我正在开始讨厌访问数据库>。 所以,根据您的反馈,我怀疑自己做了一个错误的假设:请参阅上面的edit2。 再次感谢,我会尝试,我会告诉你是否有效并告诉你结果。谢谢!【参考方案2】:

尝试在路径前使用双斜杠 (//),在路径前使用单斜杠 (/),如下所示:

Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:/Users/sample.mdb");

【讨论】:

以上是关于netBeans 和 ucanacces sql 异常仅从代码中调用 db的主要内容,如果未能解决你的问题,请参考以下文章

Java(netbeans):数据库已连接到 SQL Server,我需要从 netbeans 界面更新和删除数据

Netbeans GUI SQL 查询

抛出 java.sql.SQLSyntaxErrorException:ORA-00911:无效字符,无法在 Netbeans 中找到原因 [重复]

如何在 java NetBeans 中使用 sql 获取单个数据

无法从 sql 显示我的 netbeans jtable 中的所有行

java.sql.SQLSyntaxErrorException:ORA-00942:netbeans 8.0.1 中的表或视图不存在错误消息