使用Java创建Access数据库文件(.mdb或.accdb)

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

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

但在此,我需要配置系统DSN。 我们需要添加新的数据源(Microsoft Access Driver),然后需要提供.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文件和表时可以正常工作。

Jackcess 2.x的更新:现在使用DatabaseBuilder创建(或打开) 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. 从http://jmonscess.sourceforge.net/下载Jackcess Java库(jackcess-1.2.6.jar),从http://commons.apache.org/logging/download_logging.cgi和commons下载commons-logging-1.1.jar -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(); } } 

现在已经从Java中删除了JDBC-ODBC Bridge(从Java 8开始),未来的读者可能会对UCanAccess感兴趣, 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的详细信息,请参阅

在没有ODBC的情况下从Java操作Access数据库

您可以使用以下方法,而不是在计算机中配置系统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配置。

希望这符合您的目的!

谢谢!

下载jackcess库

使用这个库将创建.mdb文件.Bellow是来自上面位置的代码snipet下载插件库。 在类路径中添加所需的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"); } } 

`

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