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

时间:2014-04-10 09:48:11

标签: java ms-access jdbc jdbc-odbc

我创建了一个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("..");。为什么我有这个例外?

5 个答案:

答案 0 :(得分:29)

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

对于Java 8,您无法使用JDBC-ODBC Bridge,因为它已被删除。您需要使用类似UCanAccess的内容。有关更多信息,请参阅

Manipulating an Access database from Java without ODBC

答案 1 :(得分: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"));

要使用的某些导入。必须尝试使用​​catch块,并且必须注意一些必要的事情。

请记住,不需要桥接驱动程序,如jdbc odbc或任何东西。

答案 2 :(得分:3)

设定:

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(如Mr.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

(我做了那个有趣的事情becoz我无法将这些库导入我的项目)

然后我用我的项目重新打开eclipse。然后我在项目的JRE System Library文件夹中看到了所有* .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");

}

答案 3 :(得分:0)

将以下依赖项添加到您的.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");

答案 4 :(得分:0)

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