65.9K
CodeProject 正在变化。 阅读更多。
Home

从 Java 访问 MS-Access 数据库

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.78/5 (8投票s)

2009年4月5日

CPOL

3分钟阅读

viewsIcon

398098

本文演示如何从 Java 访问 MS Access 数据库。

引言

本文解释如何使用 JDBC ODBC 桥从 Java 应用程序访问 MS-Access 数据库。我们不赘述数据库的基础知识,直接进入主题。

ODBC 驱动程序

在 Java 中,我们需要在运行时加载一个驱动程序才能连接到任何数据源。ODBC 数据源也是如此。驱动程序实现为一个在运行时定位和加载的类。用于 JDBC 连接的 ODBC 驱动程序名为sun.java.odbc.JdbcOdbcDriver

ODBC 连接字符串

与 Visual C++ 一样,我们需要一个 ODBC 连接字符串才能连接到数据源。例如,假设我们正在编写一个连接到应用程序目录中名为 *myDB.mdb* 的 Access 数据库文件的 VC++ 程序。我们将使用如下 ODBC 连接字符串:

"Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;"

在 Java 中,我们将编写类似的连接字符串,但是会添加一个指向连接所需驱动程序的规范,即jdbc:odbc:。然后,在其后加上连接字符串。因此,Java 中的连接字符串变为:

"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}; DBQ=myDB.mdb;"

因此,为了概括以上内容,要能够连接到 ODBC DSN,我们需要以下形式的连接字符串:

"jdbc:odbc:ODBC DSN String"

导入连接到数据库的类

包含数据库相关类的包在java.sql中。因此,我们按如下方式导入:

import java.sql.*;

加载 JDBC:ODBC 驱动程序

按如下方式动态加载类sun.java.odbc.JdbcOdbcDriver

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

在应用程序空间中打开 MS-Access 数据库文件

为此,我们使用上面指定的 ODBC DSN

String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;";
Connection conn = DriverManager.getConnection(database, "", "");

创建一个 Statement 对象来执行 SQL 查询

必须创建Statement对象才能在打开的数据库上执行 SQL 查询。使用以下代码完成:

Statement s = conn.createStatement();

完成工作后进行清理

完成 SQL 查询后,我们调用s.close()来释放Statement对象。然后,在我们结束程序之前或在我们决定不再需要数据库之后,我们通过调用conn.close()来关闭数据库。以下代码在我们完成后进行清理:

s.close();  // Close the statement
conn.close(); // Close the database. Its no more required

在有效的 Statement 对象上执行 SQL 语句

当需要执行 SQL 查询时,调用s.execute("SQL statement")。它返回查询影响的行数。如果最后一个查询包含要返回的ResultSet(通常发生在SELECT ...类型的查询中),则调用s.getResultSet(),它返回ResultSet对象。以下代码显示如何使用SELECT查询并显示表前两列中包含的值。

String selTable = "SELECT * FROM SOMETABLE";
s.execute(selTable);
ResultSet rs = s.getResultSet();
while((rs!=null) && (rs.next()))
{
   System.out.println(rs.getString(1) + " : " + rs.getString(2));
}

就是这样。现在让我们来看一个演示应用程序,它阐明了我上面写的所有内容。

一个示例应用程序

以下应用程序执行以下操作:

  1. 加载 JDBC ODBC 驱动程序。
  2. 打开 ODBC 数据源,打开应用程序工作目录中存在的 *myDB.mdb* 文件。
  3. 获取用于 SQL 执行的Statement对象。
  4. 使用随机数生成器生成表名。
  5. 创建表。
  6. 向其中输入 25 个随机条目。
  7. 显示表的内容。
  8. 删除或删除创建的表。
  9. 关闭Statement对象,然后关闭与数据库的连接。

这是所需的代码

/* Program:
 *   Setup database driver manager to understand and use ODBC MS-ACCESS data source.
 * Written by Arnav Mukhopadhyay (ARNAV.MUKHOPADHYAY@smude.edu.in)
 * Compile as: javac dbAccess.java
 */

import java.sql.*;

public class dbAccess
{
    public static void main(String[] args)
    {
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String database = 
              "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;";
            Connection conn = DriverManager.getConnection(database, "", "");
            Statement s = conn.createStatement();
            
            // create a table
            String tableName = "myTable" + String.valueOf((int)(Math.random() * 1000.0));
            String createTable = "CREATE TABLE " + tableName + 
                                 " (id Integer, name Text(32))";
            s.execute(createTable); 
            
            // enter value into table
            for(int i=0; i<25; i++)
            {
              String addRow = "INSERT INTO " + tableName + " VALUES ( " + 
                     String.valueOf((int) (Math.random() * 32767)) + ", 'Text Value " + 
                     String.valueOf(Math.random()) + "')";
              s.execute(addRow);
            }
            
            // Fetch table
            String selTable = "SELECT * FROM " + tableName;
            s.execute(selTable);
            ResultSet rs = s.getResultSet();
            while((rs!=null) && (rs.next()))
            {
                System.out.println(rs.getString(1) + " : " + rs.getString(2));
            }
            
            // drop the table
            String dropTable = "DROP TABLE " + tableName;
            s.execute(dropTable);
            
            // close and cleanup
            s.close();
            conn.close();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

这就是我所有要说的!

© . All rights reserved.