使用JDBC和编译将Microsoft Access数据库连接到Java

对于学校数据库项目,我们正在制作数据库程序(用户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+=""; text+="\n"; } text+="\n"; } System.out.println(text); } } 

上面提到的错误:

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

我知道这篇文章是几年前发布的,但我觉得我现在正在为那些正在体验这个问题的人回答这个问题。 我花了一段时间才知道问题的答案,所以这是解决方案:

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

主要问题在于:

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

此外,如果要每次都使用相同的DSN,最好将DSN(数据源名称)添加到存储mdb的相应系统中。

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

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

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

最好的找出所带来的差异!

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