使用 JDBC 将 Microsoft Access 数据库连接到 Java 并进行编译

Posted

技术标签:

【中文标题】使用 JDBC 将 Microsoft Access 数据库连接到 Java 并进行编译【英文标题】:Connecting a Microsoft Access Database to Java using JDBC and compiling 【发布时间】:2011-05-18 06:19:45 【问题描述】:

对于一个学校数据库项目,我们正在制作一个数据库程序(用户 GUI 和数据库)。我使用 Microsoft Access 2010 创建了数据库并在其中填充了一些示例数据,并将其保存为 .mdb 格式并将其放置在我的项目文件夹中。

在 Eclipse 中运行它时,以下代码可以正常工作,连接甚至检索查询。但是我发现我无法将代码导出到 jar 并运行它(这是项目所必需的,在 CD 或闪存驱动器上给他们你的程序的工作副本),我也无法移植代码到 Netbeans 让它工作,以及尝试在 Linux 机器上编译。

我认为这是包含驱动程序或尝试使用 Microsoft 访问的问题。运行 jar 或在 Netbeans 上运行时出现的错误在代码下方给出。所以我问我如何包含驱动程序以使程序可移植,或者我还能如何解决这个问题?

提前致谢

import java.sql.*;

public class JDBCTest 
    static Connection connection;
    static Statement statement;

    public static void main(String args[])

        try 
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
            String database = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=TLDATABASEDBM.mdb";
            connection = DriverManager.getConnection( database ,"",""); 

            buildStatement();
            executeQuery();

        catch(Exception e)
            e.printStackTrace();
            System.out.println("Error!");
        
    

    public static void buildStatement() throws SQLException 
        statement = connection.createStatement();
    

    public static void executeQuery() throws SQLException 

        boolean foundResults = statement.execute("SELECT * FROM tblStaff  AS x WHERE City='Calgary'");
        if(foundResults)
            ResultSet set = statement.getResultSet();
            if(set!=null) displayResults(set);
        else 
            connection.close();
        
    

    public static void displayResults(ResultSet rs) throws SQLException 
        ResultSetMetaData metaData = rs.getMetaData();
        int columns=metaData.getColumnCount();
        String text="";

        while(rs.next())
            for(int i=1;i<=columns;++i) 
                text+=""+metaData.getColumnName(i)+":\t";
                text+=rs.getString(i);
                //text+="</"+metaData.getColumnName(i)+">";
                text+="\n";
            
            text+="\n";
        

        System.out.println(text);

    

上面提到的错误:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序 在 sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957) 在 sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114) 在 sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3073) 在 sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323) 在 sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174) 在 java.sql.DriverManager.getConnection(DriverManager.java:582) 在 java.sql.DriverManager.getConnection(DriverManager.java:207) 在 tldatabase.DataConnect.makeConnection(DataConnect.java:35) 在 tldatabase.Main.main(Main.java:24)

【问题讨论】:

【参考方案1】:

我知道这篇文章是几年前的,但我想为那些现在刚刚经历的人回答这个问题。我花了一段时间才知道问题的答案,所以这里是解决方案:

http://wiki.netbeans.org/FaqSettingHeapSize

遵循“运行 32 位 JVM”。

您所要做的就是在您的 netbeans 的安装文件夹中找到 netbeans.conf,然后将目录更改为:

netbeans_jdkhome="C:\Program Files\Java\jdk1.6.0_24"

到这里:

netbeans_jdkhome="C:\Program Files (x86)\Java\jdk1.6.0_21"

问题是 netbeans 可能运行在 64 位,但 MS Access 只支持 32 位。因此,这样做有望解决问题。还要确保安装这个:

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23734

【讨论】:

【参考方案2】:

主要问题出在这行:

String database = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=TLDATABASEDBM.mdb";
    确保 .mdb 文件位于正确的目录中。 检查文件扩展名为 .mdb 或 .mdbacc。

另外,如果您想每次都使用相同的 DSN,最好将 DSN(Data Source Name) 添加到存储 mdb 的相应系统中。

【讨论】:

【参考方案3】:

我认为您的应用在当前目录中看不到 TLDATABASEDBM.mdb。您可以在连接字符串中提供此文件的完整路径或在 ODBC 管理器中添加系统 DSN,然后使用连接字符串连接到它,例如:jdbc:odbc:TLDATABASEDBM

【讨论】:

使用工作 Eclipse 版本的代码进行测试,如果文件路径不正确,我会收到无法打开未知文件错误,而不是“未找到数据源名称且未指定默认驱动程序”错误。我不确定我是否可以使用 DSN 并让 jar 工作,因为我需要将整个数据库程序打包并交给老师运行。我之前尝试过使用 DSN 路由,但在让它工作时遇到了一些麻烦,我会再试一次,并询问我是否可以在将程序交给 TA 进行演示时阅读我以运行该程序。不过感谢您的帮助。 好吧,它可以将 DSN 作为 jar 文件使用。我现在唯一的问题是,如果他们在非 Windows 计算机上运行程序,这将不起作用,因为只有 Windows 具有连接到 ms 访问文件的驱动程序,对吗?我假设没有其他方法可以使用 java 连接到 ms access .mdb 文件?谢谢! 我使用 Jython 和 Northwind Access 数据库对其进行了测试。它适用于包含完整 .mdb 文件名和 DSN 的连接字符串。我不确定在 Java 中是否必须在 Class.forName() 之后添加 newInstance()。在 Java6 中,您甚至不需要调用 Class.forName()。看看onjava.com/pub/a/onjava/2006/08/02/…。【参考方案4】:

老实说,我不喜欢我要说的话……但是,它为我解决了同样的问题……神秘地……:(((

在您定义数据库变量的那一行,我将 ...(.mdb)... 更改为 ...(.mdb, *.accdb)...

祝大家搞清楚这有什么不同!

【讨论】:

这是您的驱动程序在数据源中的实际名称,因此您解决了它。【参考方案5】:
package javaapplication1;

import java.sql.*;

public class MSaccess_archive 
public static void main(String[] args) 

    try 

       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// set this to a MS Access DB you have on your machine
String filename = "mdbTEST.mdb";
String database = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=";
database+= filename.trim() + ";DriverID=22;"; // add on to the end 
// now we can get the connection from the DriverManager
Connection con = DriverManager.getConnection( database ,"","");

        Statement stmt = con.createStatement();

        stmt.execute("select * from student"); // execute query in table student

        ResultSet rs = stmt.getResultSet(); // get any Result that came from our query

        if (rs != null)
         while ( rs.next() )

            System.out.println("Name: " + rs.getInt("Age") + " ID:       "+rs.getString("Course"));
            

            stmt.close();
            con.close();
        
        catch (Exception err) 
            System.out.println("ERROR: " + err);
        
   


【讨论】:

以上是关于使用 JDBC 将 Microsoft Access 数据库连接到 Java 并进行编译的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Jmeter 创建类“com.microsoft.sqlserver.jdbc.SQLServerDriver”的 JDBC 驱动程序

什么相当于Microsoft JDBC中的JTDS属性?

jsp - java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。

适用于 Oracle 和 JDBC 的 Microsoft ODBC

java.sql.SQLException:找不到适合 jdbc:microsoft:sqlserver 的驱动程序