java.lang.ClassNotFoundException: возникает исключение sun.jdbc.odbc.JdbcOdbcDriver. Почему?

Я создал базу данных 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("..");. Почему у меня это исключение?


person hina abbasi    schedule 10.04.2014    source источник
comment
Хина, я не уверен, является ли это дубликатом stackoverflow.com /questions/19709843/, но вам определенно стоит взглянуть на этот вопрос.   -  person Dawood ibn Kareem    schedule 10.04.2014
comment
Еще один дубликат для списка stackoverflow.com/search?q=jdbc+ClassNotFoundException   -  person Oleg Estekhin    schedule 10.04.2014
comment
@OlegEstekhin, ну да, но мост JDBC ODBC - это особый случай.   -  person Dawood ibn Kareem    schedule 10.04.2014
comment
Какую версию Java вы используете?   -  person Mark Rotteveel    schedule 10.04.2014
comment
@MarkRotteveel дорогой, это java8, jdk 8, но я также пробовал с jdk 7.   -  person hina abbasi    schedule 10.04.2014
comment
@hinaabbasi Я не твой «дорогой» ... Мост JDBC-ODBC был удален из Java 8, он включен в Java 7 только для Windows   -  person Mark Rotteveel    schedule 10.04.2014


Ответы (5)


Для Java 7 вы можете просто опустить оператор Class.forName(), так как он на самом деле не требуется.

Для Java 8 вы не можете использовать мост JDBC-ODBC, поскольку он был удален. Вместо этого вам нужно будет использовать что-то вроде UCanAccess. Для получения дополнительной информации см.

Управление базой данных Access из Java без ODBC

person Gord Thompson    schedule 10.04.2014
comment
это jackcess .. но jackcess мне тоже не помогает. снова происходят некоторые исключения. я использую базу данных db = DatabaseBuilder.open (новый файл (db.mdb)); - person hina abbasi; 11.04.2014
comment
БД базы данных; db = DatabaseBuilder.open(новый файл(E://PersonsDB/personsinfo.mdb)); - person hina abbasi; 12.04.2014
comment
@hinaabbasi Если у вас есть вопрос об использовании UCanAccess или Jackcess, задайте новый вопрос, который включает соответствующий код и фактическое сообщение об ошибке ( с) вы получаете. - person Gord Thompson; 12.04.2014
comment
Работает ли это для базы данных Visual FoxPro? Я просто пробовал и не работал. Так как он не имеет расширения файла .accdb. Спасибо - person Yubaraj; 17.06.2016
comment
@Yubaraj - Нет, UCanAccess не может работать с базами данных VFP. - person Gord Thompson; 17.06.2016
comment
@GordThompson, пожалуйста, взгляните на это stackoverflow.com/questions/42275749/ - person Pranav MS; 16.02.2017

в JDK 8 мост jdbc odbc больше не используется и поэтому удален из JDK. для использования базы данных Microsoft Access в JAVA вам понадобятся 5 дополнительных библиотек JAR.

1- hsqldb.jar

2- домкрат 2.0.4.jar

3- commons-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 или что-то еще.

person Umair Bhatti    schedule 16.08.2014

Настраивать:

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") тоже не работал. Затем я захожу на этот веб-сайт и загружаю ZIP-архив UCanAccess 2.0.8 (как сказал г-н Горд Томпсон). ) файл и распакуйте его.

Затем вы также сможете найти эти файлы *.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

(Я сделал эту забавную вещь, потому что не смог импортировать эти библиотеки в свой проект)

Затем я снова открываю eclipse с моим проектом. Затем я вижу все файлы *.jar в папке системной библиотеки JRE моего проекта.

Наконец мой код работает.

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

}
person Hasith Sithila    schedule 26.08.2014
comment
с тех пор, как оракул купил солнце, все в java идет вниз, будь ты проклят, оракул - person Dunken; 25.06.2016

добавьте эти зависимости в ваш файл .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");
person selins sofa    schedule 14.01.2020

Перед запуском программы Java убедитесь, что вы закрыли файл MSAccess.

person Saddam Hussain    schedule 21.06.2020