Java.lang.ClassNotFoundException: Sun.jdbc.odbc.jdbcodbcDriver Exception. Waarom?

Ik heb een MS Access-database gemaakt en er een DSN aan toegewezen. Ik wil het via mijn Java-applicatie openen.

Dit is wat ik aan het doen ben:

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

Ik krijg de uitzondering bij de eerste regel van het blokkering. Dat is class.forname("..");. Waarom heb ik deze uitzondering?


Antwoord 1, Autoriteit 100%

Voor Java 7 kunt u eenvoudig de Class.forName()verklaring weglaten, zoals het niet echt vereist is.

Voor Java 8 kunt u de JDBC-ODBC Bridge niet gebruiken omdat deze is verwijderd. Je zult in plaats daarvan iets als UCanAccessmoeten gebruiken. Voor meer informatie, zie

Een Access-database manipuleren vanuit Java zonder ODBC


Antwoord 2, autoriteit 17%

in JDK 8 wordt jdbc odbc bridge niet meer gebruikt en daarom verwijderd uit de JDK. om Microsoft Access-database in JAVA te gebruiken, hebt u 5 extra JAR-bibliotheken nodig.

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

voeg deze bibliotheken toe aan uw java-project en begin met de volgende regels.

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

pad zou kunnen zijn als E:/Project/JAVA/DBApp

en vervolgens uw query die moet worden uitgevoerd. Vind ik leuk

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

bepaalde invoer die moet worden gebruikt. try catch-blok moet worden gebruikt en sommige noodzakelijke dingen mogen niet worden vergeten.

Vergeet niet dat het niet nodig is om stuurprogramma’s zoals jdbc odbc of wat dan ook te overbruggen.


Antwoord 3, autoriteit 10%

Instellen:

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

Zo overwin ik mijn fout.

In het begin werkte mijn Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")ook niet.
Dan log ik in op deze websiteen downloadde de UCanAccess 2.0.8 zip (zoals Mr.Gord Thompson zei ) bestand en pak het uit.

Dan kun je deze *.jar-bestanden ook vinden in die unzip-map:

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

Wat ik vervolgens deed, was dat ik al deze 5 bestanden kopieerde en ze op deze 2 locaties plakte:

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

(Ik deed dat grappige omdat ik deze bibliotheken niet naar mijn project kon importeren)

Vervolgens heropen ik de zonsverduistering met mijn project. Dan zie ik al die *.jar-bestanden in de JRE-systeembibliotheekmap van mijn project.

Eindelijk werkt mijn code.

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

Antwoord 4

voeg deze afhankelijkheden toe aan uw .pom-bestand:

<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>

en voeg toe aan uw code om een chauffeur te bellen:

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

Antwoord 5

Zorg ervoor dat u uw MSAccess-bestand hebt gesloten voordat u het java-programma uitvoert.

Other episodes