【问题标题】:Create an Access database file (.mdb or .accdb) using Java使用 Java 创建 Access 数据库文件(.mdb 或 .accdb)
【发布时间】:2012-03-21 13:43:10
【问题描述】:

目前我有一个可以访问 .mdb 或 .accdb 的应用程序 使用 JdbcOdbcDriver 文件来附加一些数据。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con = DriverManager.getConnection("jdbc:odbc:MsAccessDSN");

但在此,我需要配置系统 DSN。我们需要添加新的数据源(Microsoft Access 驱动程序),然后需要提供 .mdb 文件的位置。只有这样,上面的代码才能工作。

假设我想在其他系统上运行我的应用程序,那么我需要对那台计算机做同样的事情。 如果我将我的应用程序提供给客户并且他/她不知道如何配置 .mdb 文件。那么我所有的努力都将付诸东流。 因此,我可以使用任何驱动程序通过我的 Java 代码创建 .mdb 文件,然后将所有数据附加到 .mdb 文件的表中。 或者有没有其他方法,Java代码可以创建.mdb文件并能够访问这个数据库文件。

我尝试了这段代码,它在不配置系统 DNS 的情况下附加数据:

public class TestMsAccess {

private static Connection con;
private static Statement stm;
private static String tableName = "EmpDetail";
private static int id_is = 2;
private static String name_is = "Employee1";

public static void main(String[] args) throws ClassNotFoundException, SQLException {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\MSAccessProject/Employee.mdb", "", "");

    stm = con.createStatement();
    // enter value into table
     String addRow = "INSERT INTO " + tableName  + " VALUES ( "
        + id_is + ", '" 
        + name_is + "')";
     stm.execute(addRow);

     if (con != null) { con.close(); }
     if (stm != null) { stm.close(); }
}

}

但问题是,这段代码不会自动创建 .mdb 文件,而是在我在运行这段代码之前创建 .mbd 文件和表时工作。

【问题讨论】:

    标签: java database ms-access driver


    【解决方案1】:

    Jackcess 2.x 更新:现在使用DatabaseBuilder 创建(或打开)数据库,因此我们要创建一个新的数据库文件

    import java.io.File;
    import java.io.IOException;
    
    import com.healthmarketscience.jackcess.Database;
    import com.healthmarketscience.jackcess.Database.FileFormat;
    import com.healthmarketscience.jackcess.DatabaseBuilder;
    
    public class JackcessDemoMain {
    
        public static void main(String[] args) {
            String dbPath = "C:/Users/Public/newDb.accdb";
            // using try-with-resources is recommended to ensure that 
            //   the Database object will be closed properly
            try (Database db = DatabaseBuilder.create(FileFormat.V2010, new File(dbPath))) {
                System.out.println("The database file has been created.");
            } catch (IOException ioe) {
                ioe.printStackTrace(System.err);
            }
    
        }
    
    }
    

    Jackcess 1.x 的原始答案(已弃用):

    如果您想通过 java 创建“.mdb”文件,您可以使用 Jackcess Java 库,它是用于读取和写入 MS Access 数据库的纯 Java 库之一。目前支持的版本包括 2000-2007 我猜。请查看以下示例以更好地理解:

    1. 下载 Jackcess Java 库 (jackcess-1.2.6.jar) 来自http://jackcess.sourceforge.net/ 和 commons-logging-1.1.jar 来自http://commons.apache.org/logging/download_logging.cgi 和 commons-lang-2.0.jar 来自http://www.findjar.com/index.x?query=commons-lang
    2. 将这两个 jar 添加到您的类路径中。
    3. 尝试以下代码自动创建数据库:

    package com.jackcess.lib;
    
    
    import com.healthmarketscience.jackcess.ColumnBuilder;
    import com.healthmarketscience.jackcess.Database;
    import com.healthmarketscience.jackcess.Table;
    import com.healthmarketscience.jackcess.TableBuilder;
    import java.io.File;
    import java.io.IOException;
    import java.sql.SQLException;
    import java.sql.Types;
    
    /**
     *
     * @author sarath_ivan
     */
    public class JackcessLibrary {
    
        private static Database createDatabase(String databaseName) throws IOException {
            return Database.create(new File(databaseName));
        }
    
        private static TableBuilder createTable(String tableName) {
            return new TableBuilder(tableName);
        }
    
        public static void addColumn(Database database, TableBuilder tableName, String columnName, Types sqlType) throws SQLException, IOException {
            tableName.addColumn(new ColumnBuilder(columnName).setSQLType(Types.INTEGER).toColumn()).toTable(database);
        }
    
        public static void startDatabaseProcess() throws IOException, SQLException {
            String databaseName = "C:/Users/compaq/Desktop/employeedb.mdb"; // Creating an MS Access database
            Database database = createDatabase(databaseName);
    
            String tableName = "Employee"; // Creating table
            Table table = createTable(tableName)
                    .addColumn(new ColumnBuilder("Emp_Id").setSQLType(Types.INTEGER).toColumn())
                    .addColumn(new ColumnBuilder("Emp_Name").setSQLType(Types.VARCHAR).toColumn())
                    .addColumn(new ColumnBuilder("Emp_Employer").setSQLType(Types.VARCHAR).toColumn())
                    .toTable(database);
    
            table.addRow(122875, "Sarath Kumar Sivan","Infosys Limited.");//Inserting values into the table
        }
    
        public static void main(String[] args) throws IOException, SQLException {
            JackcessLibrary.startDatabaseProcess();
        }
    }
    

    【讨论】:

    • thanx 很多...运行此代码时出现两个错误:线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/commons/lang/builder/CompareToBuilder 和 org.apache .commons.lang.builder.CompareToBuilder
    • 糟糕!运行上述代码还需要一个库。那是commons-lang-2.0.jar。我忘了在上一篇文章中提到它。非常抱歉给您带来不便。您可以从 findjar.com/index.x?query=commons-lang 下载 commons-lang-2.0.jar。下载后,将此 jar 文件添加到您的类路径并再次运行上述代码。这将保存您的目的!
    • 正如我在my answer 中提到的,UCanAccess 是一个纯Java JDBC 驱动程序,它还可以创建.mdb 和.accdb 数据库文件。 UCanAccess 实际上使用 Jackcess 来读取和写入数据库文件,但是由于 UCanAccess 是一个 JDBC 驱动程序,我们可以使用更熟悉的 SQL 语句(DML 和 DDL),而不必学习 Jackcess API。更多详情here.
    【解决方案2】:

    现在 JDBC-ODBC 桥已从 Java 中删除(从 Java 8 开始),未来的读者可能会对 UCanAccess 感兴趣,这是一个用于 Access 数据库的免费和开源的纯 Java JDBC 驱动程序。 UCanAccess 包含一个newdatabaseversion 连接参数,如果 Access .accdb 或 .mdb 文件不存在,它将创建它。

    示例代码:

    String dbFileSpec = "C:/Users/Gord/Desktop/myDb.accdb";
    try (Connection conn = DriverManager.getConnection(
            "jdbc:ucanaccess://" + dbFileSpec + 
            ";newdatabaseversion=V2010")) {
        DatabaseMetaData dmd = conn.getMetaData();
        try (ResultSet rs = dmd.getTables(null, null, "Clients", new String[] { "TABLE" })) {
            if (rs.next()) {
                System.out.println("Table [Clients] already exists.");
            } else {
                System.out.println("Table [Clients] does not exist.");
                try (Statement s = conn.createStatement()) {
                    s.executeUpdate("CREATE TABLE Clients (ID COUNTER PRIMARY KEY, LastName TEXT(100))");
                    System.out.println("Table [Clients] created.");
                }
            }
        }
        conn.close();
    }
    

    有关如何设置 UCanAccess 的详细信息,请参阅

    Manipulating an Access database from Java without ODBC

    【讨论】:

    • 我猜在这个例子中它假设 myDb.accdb 已经有一些数据。我可以在新创建的 myDb.accdb 文件中创建表并向它们添加数据吗?
    • @NishantShreshth “我可以创建表格并向其中添加数据吗” 可以。上面的代码示例实际上确实会创建一个“客户”表(如果尚不存在)。这就是CREATE TABLE ... 语句的作用。
    • 文件 file = new File("testDb.accdb");文件.createNewFile();字符串 dbFileSpec = file.getAbsolutePath();我正在创建新文件并使用您的所有逻辑,但出现异常:net.ucanaccess.jdbc.UcanaccessSQLException:空数据库文件。
    • 在我的用例中,我需要创建新文件并向其中添加数据。当我尝试创建新文件时,它会抛出一个 UcanaccessSqlException:空数据库文件。我该如何处理?
    • @NishantShreshth 不要使用file.createNewFile()。只需在连接 URL 中包含文件的路径以及 ;newdatabaseversion=V2010 参数,UCanAccess 就会为您创建文件。如果您需要进一步的帮助,请ask a new question
    【解决方案3】:

    您可以使用以下方法,而不是在您的机器中配置系统 DSN。

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    connection = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/Users/Desktop/your-database-file.mdb", "", "");
    

    这里的“your-database-file.mdb”是您的 MS-Access 文件。您可以在代码中提供数据库文件的完整路径以建立连接。您还可以将数据库文件保存在您的项目(应用程序)文件夹中。在这种情况下,您将能够将您的数据库文件与应用程序一起提供给客户端,他/她可以使用您的应用程序而无需进行任何 DSN 配置。

    希望这能达到您的目的!

    谢谢!

    【讨论】:

    • thanx dude ...此代码工作正常。但问题是,只有当 .mdb 文件出现在您在 getConnection 中提供的位置时,此代码才有效。它无法自动创建 .mdb 文件,如果您不自己创建 .mdb 文件,则会引发一个错误:[Microsoft][ODBC Microsoft Access Driver] 找不到文件“(未知)”。
    【解决方案4】:

    download jackcess library

    使用这个库,它将创建 .mdb 文件。下面是代码片段 从上面的位置下载 jackcess 库。在类路径中添加所需的 jar 文件。

    `

    import java.io.File;
    import java.io.IOException;
    import java.sql.SQLException;
    import java.sql.Types;
    
    import com.healthmarketscience.jackcess.ColumnBuilder;
    import com.healthmarketscience.jackcess.Database;
    import com.healthmarketscience.jackcess.DatabaseBuilder;
    import com.healthmarketscience.jackcess.Table;
    import com.healthmarketscience.jackcess.TableBuilder;
    
    public class MDBFileGenerator {
        public static void main(String[] args) throws IOException, SQLException {
            Database db = DatabaseBuilder.create(Database.FileFormat.V2000,
                    new File("new.mdb"));
            Table newTable = new TableBuilder("NewTable")
                    .addColumn(new ColumnBuilder("a").setSQLType(Types.INTEGER))
                    .addColumn(new ColumnBuilder("b").setSQLType(Types.VARCHAR))
                    .toTable(db);
            newTable.addRow(1, "foo");
        }
    }
    

    `

    【讨论】:

      【解决方案5】:

      看起来至少有一个选项可以在没有 JdbcOdbcDriver 的情况下直接连接到 .mdb,该选项是商业的。 See here. 如果您想避免这种设置,您是否考虑过使用像 sqlite 这样的嵌入式数据库?

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 2011-03-20
      • 1970-01-01
      • 2018-12-13
      • 2011-09-09
      • 2015-01-16
      • 2013-04-08
      • 2010-09-25
      相关资源
      最近更新 更多