Создайте файл базы данных Access (.mdb или.accdb), используя Java
В настоящее время у меня есть одно приложение, в котором я могу получить доступ к файлу.mdb или.accdb с помощью JdbcOdbcDriver, чтобы добавить некоторые данные.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:MsAccessDSN");
но в этом мне нужно настроить System DSN. Нам нужно добавить новый источник данных (драйвер Microsoft Access), а затем указать местоположение файла.mdb. Только тогда приведенный выше код будет работать.
Предположим, я хочу запустить свое приложение в другой системе, а затем сделать то же самое с этим компьютером. Если я передаю свое заявление клиенту, и он / она не знает, как настроить файл.mdb. Тогда все мои усилия будут напрасными. Таким образом, доступен любой драйвер, с помощью которого я создаю файл.mdb с помощью своего кода Java, а затем добавляю все данные в таблицу файла.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 перед запуском этого кода.
5 ответов
Обновление для 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 (устарело):
Если вы хотите создать файл ".mdb" через java, вы можете использовать библиотеку Java Jackcess, которая является одной из библиотек Java для чтения и записи в базы данных MS Access. В настоящее время поддерживаемые версии включают 2000-2007, я думаю. Пожалуйста, посмотрите на приведенный ниже пример для лучшего понимания:
- Загрузите Java-библиотеку Jackcess (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
- Добавьте обе банки в ваш путь к классам.
- Попробуйте приведенный ниже код для автоматического создания базы данных:
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, бесплатном чистом Java-драйвере JDBC с открытым исходным кодом для баз данных Access. 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 см.
используйте эту библиотеку, которая создаст файл.mdb. Ниже приведен фрагмент библиотеки загрузки файлов из вышеуказанного местоположения. добавить требуемый файл 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");
}
}
`
Вы можете использовать приведенный ниже метод вместо настройки System 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.
Надеюсь, что это служит вашей цели!
Спасибо вам!
Похоже, что есть хотя бы одна опция для прямого подключения к.mdb без JdbcOdbcDriver, эта опция коммерческая. Посмотреть здесь. Если вы пытаетесь избежать установки, рассматриваете ли вы возможность использования встроенной базы данных, такой как sqlite?