java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 发生异常。为啥?

Posted

技术标签:

【中文标题】java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 发生异常。为啥?【英文标题】:java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver Exception occurring. Why?java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 发生异常。为什么? 【发布时间】:2014-05-23 22:44:02 【问题描述】:

我创建了一个 MS Access 数据库并为其分配了一个 DSN。我想通过我的 Java 应用程序访问它。

这就是我正在做的:

public class AccessDbConnection 

    public static void main(String[] args) 
        System.out.println("**ACCESS DB CONNECTION**");

        try 
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // for MS Access ... MS access driver loading

            String     conURL    = "jdbc:odbc:sampleDNS";
            Connection con       = DriverManager.getConnection(conURL);
            Statement  statement = con.createStatement();
            String     qry       = "SELECT * FROM Table1";
            ResultSet  rs        = statement.executeQuery(qry);

            while(rs.next()) 
                String id    = rs.getString("ID") ;
                String fname = rs.getString("First_Name");
                String lname = rs.getString("Last_Name");
                System.out.println(id + fname + lname);
            
         catch (ClassNotFoundException ex) 
            System.out.println("Classforname Exception!!");
            Logger.getLogger(AccessDbConnection.class.getName()).log(Level.SEVERE, null, ex);
         catch (SQLException ex) 
            System.out.println("DriverManager Exception!!");
            Logger.getLogger(AccessDbConnection.class.getName()).log(Level.SEVERE, null, ex);
        
    

我在 try 块的第一行遇到异常。那是class.forname("..");。为什么我有这个异常?

【问题讨论】:

Hina,我不确定这是否与 ***.com/questions/19709843/… 重复,但您一定值得看看这个问题。 ***.com/search?q=jdbc+ClassNotFoundException列表的另一个重复 @OlegEstekhin,嗯,是的,但是 JDBC ODBC 桥接器是一种特殊情况。 您使用的是哪个 Java 版本? @MarkRotteveel 亲爱的 java8,jdk 8,但我也尝试过 jdk 7。 【参考方案1】:

确保在运行 java 程序之前已关闭 MSAccess 文件。

【讨论】:

【参考方案2】:

将这些依赖项添加到您的 .pom 文件中:

<dependency>
  <groupId>org.hsqldb</groupId>
  <artifactId>hsqldb</artifactId>
  <version>2.5.0</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>com.healthmarketscience.jackcess</groupId>
  <artifactId>jackcess-encrypt</artifactId>
  <version>3.0.0</version>
</dependency>

<dependency>
  <groupId>net.sf.ucanaccess</groupId>
  <artifactId>ucanaccess</artifactId>
  <version>5.0.0</version>
</dependency>

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.9</version>
</dependency>

<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.2</version>
</dependency>

并添加到您的代码中以调用驱动程序:

Connection conn = DriverManager.getConnection("jdbc:ucanaccess://file_location/accessdb_file_name.mdb;memory=false");

【讨论】:

【参考方案3】:

对于 Java 7,您可以简单地省略 Class.forName() 语句,因为它并不是真正需要的。

对于 Java 8,您不能使用 JDBC-ODBC 桥,因为它已被删除。您将需要改用 UCanAccess 之类的东西。有关详细信息,请参阅

Manipulating an Access database from Java without ODBC

【讨论】:

那是 jackcess .. 但 jackcess 也没有帮助我。再次出现一些例外情况。我正在使用 Database db = DatabaseBuilder.open(new File("db.mdb")); 数据库数据库; db = DatabaseBuilder.open(new File("E://PersonsDB/personsinfo.mdb")); @hinaabbasi 如果您对使用 UCanAccess 或 Jackcess 有任何疑问,请ask a new question 包含相关代码和您收到的实际错误消息。 它适用于 Visual FoxPro 数据库吗?我只是尝试过,但没有奏效。因为它没有.accdb 文件扩展名。谢谢 @Yubaraj - 不,UCanAccess 不能用于 VFP 数据库。【参考方案4】:

设置:

My OS windows 8 64bit
Eclipse version Standard/SDK Kepler Service Release 2
My JDK is jdk-8u5-windows-i586
My JRE is jre-8u5-windows-i586

这就是我克服错误的方法。

一开始我的Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") 也不起作用。 然后我登录到这个website 并下载 UCanAccess 2.0.8 zip(正如 Gord Thompson 先生所说)文件并解压缩。

然后您还可以在该解压缩文件夹中找到这些 *.jar 文件:

ucanaccess-2.0.8.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
hsqldb.jar
jackcess-2.0.4.jar

然后我所做的就是复制所有这 5 个文件并将它们粘贴到这两个位置:

C:\Program Files (x86)\eclipse\lib
C:\Program Files (x86)\eclipse\lib\ext

(我做了一件有趣的事,因为我无法将这些库导入到我的项目中)

然后我用我的项目重新打开 Eclipse。然后我在项目的 JRE 系统库文件夹中看到所有 *.jar 文件。

我的代码终于可以工作了。

public static void main(String[] args) 


    try
    

        Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:\\Users\\Hasith\\Documents\\JavaDatabase1.mdb");
        Statement stment = conn.createStatement();
        String qry = "SELECT * FROM Table1";

        ResultSet rs = stment.executeQuery(qry);
        while(rs.next())
        
            String id    = rs.getString("ID") ;
            String fname = rs.getString("Nama");

            System.out.println(id + fname);
        
    
    catch(Exception err)
    
        System.out.println(err);
    


    //System.out.println("Hasith Sithila");


【讨论】:

自从 oracle 购买了 sun,java 中的所有东西都在下降,该死的 oracle【参考方案5】:

在 JDK 8 中,jdbc odbc 桥不再使用,因此从 JDK 中删除。要在 JAVA 中使用 Microsoft Access 数据库,您需要 5 个额外的 JAR 库。

1- hsqldb.jar

2-jackcess 2.0.4.jar

3-commons-lang-2.6.jar

4-commons-logging-1.1.1.jar

5-ucanaccess-2.0.8.jar

将这些库添加到您的 java 项目中并从以下几行开始。

Connection conn=DriverManager.getConnection("jdbc:ucanaccess://<Path to your database i.e. MS Access DB>");
Statement s = conn.createStatement();

路径可能类似于 E:/Project/JAVA/DBApp

然后你的查询被执行。喜欢

ResultSet rs = s.executeQuery("SELECT * FROM Course");
while(rs.next())
    System.out.println(rs.getString("Title") + " " + rs.getString("Code") + " " + rs.getString("Credits"));

要使用的某些导入。必须使用try catch块,一些必要的事情不要忘记。

记住,不需要像 jdbc odbc 之类的桥接驱动程序或任何东西。

【讨论】:

以上是关于java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 发生异常。为啥?的主要内容,如果未能解决你的问题,请参考以下文章