目前我有一个应用程序可以访问.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文件和表时工作。
更新Jackcess2.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);
}
}
}
Jackcess1.x的原始答案(已弃用):
如果您想通过java创建".mdb"文件,您可以使用Jackcess java库,它是用于读取和写入MS Access数据库的纯java库之一。我想目前支持的版本包括2000-2007年。请看下面的例子以更好地理解:
- 下载jaccess Java库(jaccess-1.2.6.jar)从…起http://jackcess.sourceforge.net/和普通日志-1.1.jar从…起http://commons.apache.org/logging/download_logging.cgi和commons-lang-2.0.jar从…起http://www.findjar.com/index.x?query=commons-郎
- 将两个jar都添加到类路径中
- 尝试使用以下代码自动创建数据库:
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();
}
}
既然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的详细信息,请参阅
在没有ODBC 的情况下从Java操作Access数据库
下载jaccess库
使用这个库whcih将创建.mdb文件。Bellow是密码狙击手从上面的位置下载jaccess库。在类路径中添加所需的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");
}
}
`
您可以使用以下方法,而不是在机器中配置系统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", "", "");
这里的"您的数据库文件.mdb"是您的MS Access文件。您可以在代码中提供数据库文件的完整路径以建立连接。您也可以将数据库文件保存在项目(应用程序)文件夹中。在这种情况下,您可以将数据库文件和应用程序一起提供给客户端,他/她可以使用您的应用程序,而无需再进行DSN配置。
希望这能达到你的目的!
谢谢!
看起来至少有一个选项可以在不使用JdbcOdbcDriver的情况下直接连接到.mdb,该选项是商业性的。请参见此处。如果设置是你试图避免的,你有没有考虑过使用像sqlite这样的嵌入式数据库?