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

java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver Exception occurring. Why?

提问人:hina abbasi 提问时间:4/10/2014 最后编辑:TallTedhina abbasi 更新时间:6/21/2020 访问量:214632

问:

我创建了一个 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("..");

java ms-access jdbc-odbc

评论

1赞 Dawood ibn Kareem 4/10/2014
希娜,我不确定这是否是 stackoverflow.com/questions/19709843/ 的复制品......但你肯定值得看看这个问题。
0赞 Oleg Estekhin 4/10/2014
stackoverflow.com/search?q=jdbc+ClassNotFoundException 列表还有一个重复项
0赞 Dawood ibn Kareem 4/10/2014
@OlegEstekhin,嗯,是的,但是JDBC ODBC桥接是一个特例。
1赞 Mark Rotteveel 4/10/2014
您使用的是哪个 Java 版本?
0赞 hina abbasi 4/11/2014
@MarkRotteveel亲爱的 java8 , JDK 8,但我也尝试过 JDK 7。

答:

31赞 Gord Thompson 4/11/2014 #1

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

对于 Java 8,您不能使用 JDBC-ODBC 桥接,因为它已被除去。您需要改用类似 UCanAccess 的东西。有关更多信息,请参阅 。

在没有 ODBC 的情况下从 Java 操作 Access 数据库

评论

1赞 hina abbasi 4/11/2014
那是杰克塞斯......但杰克塞斯也没有帮助我。同样,也发生了一些异常。我正在使用数据库 db = DatabaseBuilder.open(新文件(“db.mdb”));
0赞 hina abbasi 4/12/2014
数据库数据库;db = DatabaseBuilder.open(new File(“E://PersonsDB/personsinfo.mdb”));
1赞 Gord Thompson 4/13/2014
@hinaabbasi 如果您对使用 UCanAccess 或 Jackcess 有疑问,请提出一个新问题,其中包括相关代码和您收到的实际错误消息。
0赞 Yubaraj 6/17/2016
它适用于 Visual FoxPro 数据库吗?我只是尝试过但没有奏效。因为它没有文件扩展名。谢谢.accdb
0赞 Gord Thompson 6/17/2016
@Yubaraj - 不可以,UCanAccess 不能使用 VFP 数据库。
5赞 Umair Bhatti 8/16/2014 #2

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

1- hsqldb.jar

2- 千斤顶 2.0.4.jar

3- 共享资源-lang-2.6.jar

4- 共享日志记录-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 或任何东西等驱动程序。

4赞 Hasith Sithila 8/27/2014 #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

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

一开始我也没有工作。 然后我登录这个网站,下载了UCanAccess 2.0.8 zip文件(正如Gord Thompson先生所说)并解压缩。Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")

然后,您还可以在该解压缩文件夹中找到这些 *.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 个文件并将它们粘贴到以下 2 个位置:

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

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

然后我用我的项目重新打开日食,然后我在我项目的 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");

}

评论

1赞 Dunken 6/25/2016
自从 Oracle 收购了 Sun 之后,Java 中的一切都在下降,该死的 Oracle
0赞 selins sofa 1/14/2020 #4

将以下依赖项添加到 .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");
0赞 Saddam Hussain 6/21/2020 #5

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