使用 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 驱动程序
jsp - java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。