问题
I have referred selected answer to this question: Java: Create MSAccess Database File (.mdb 0r .accdb) using Java.
I have MS Office 2010 in my machine. I am trying to create access database file (*.mdb / *.accdb). But, still the file is not getting created itself throwing following exception:
Exception in thread "main" java.io.FileNotFoundException: given file does not exist: C:\Users\473886\Desktop\employeedb1.mdb
at com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:360)
at com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:170)
at mdb.MDBWriter.createDatabase(MDBWriter.java:93)
at mdb.MDBWriter.startDatabaseProcess(MDBWriter.java:107)
at mdb.MDBWriter.main(MDBWriter.java:120)
I have used the same code available in the answer with one modification that I have used file dialog that will ask me where I want to save the database file:
public class MDBWriter {
public static String saveFile(Frame f, String title, String defDir, String fileType) {
FileDialog fd = new FileDialog(f, title, FileDialog.SAVE);
fd.setFile(fileType);
fd.setDirectory(defDir);
fd.setLocation(50, 50);
fd.show();
return (fd.getDirectory() + "\\" + fd.getFile());
}
private static Database createDatabase(String databaseName) throws IOException {
// return Database.create(new File(databaseName));
File file = new File(databaseName);
return new DatabaseBuilder(file)
.setFileFormat(Database.FileFormat.V2010)
.open();
}
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 fileName = saveFile(new Frame(), "Save...", ".\\", "*.mdb");
String databaseName = "D:\\employeedb1.accdb"; // Creating an MS Access database
Database database = createDatabase(fileName);
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 {
startDatabaseProcess();
}
}
Please suggest some solution.
回答1:
If you want to create a new database, you need to call DatabaseBuilder.create()
, not open()
(which opens an existing database).
回答2:
No way to create [an Access database] from [Java] code !
Nonsense. The following works on any platform with Java and Jackcess...
import com.healthmarketscience.jackcess.*;
import java.io.File;
public class bar {
public static void main(String[] args) {
try {
DatabaseBuilder.create(Database.FileFormat.V2010, new File("/home/gord/jTest.accdb"));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Done!");
}
}
..and the following code works in Java on Windows without Jackcess (but requires the Access Database Engine)...
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
public class CreateAccdb {
public static void main(String[] args) {
String databaseName = "C:\\__tmp\\employeedb1.accdb";
String tempScriptName = System.getenv("TEMP") + "\\$$CreateAccdbScript.vbs";
try {
BufferedWriter out = new BufferedWriter(new FileWriter(tempScriptName));
out.write("Set cat = CreateObject(\"ADOX.Catalog\")");
out.newLine();
out.write("cat.Create \"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + databaseName + ";\"");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
String cmd = "cscript " + tempScriptName;
try {
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
BufferedReader rdr =
new BufferedReader(new InputStreamReader(p.getErrorStream()));
int errorLines = 0;
String line = rdr.readLine();
while (line != null) {
errorLines++;
System.out.println(line); // display error line(s), if any
line = rdr.readLine();
}
if (errorLines == 0) {
System.out.println("The operation completed successfully.");
}
} catch(Exception e) {
e.printStackTrace();
}
try {
Files.deleteIfExists(Paths.get(tempScriptName));
} catch(Exception e) {
e.printStackTrace();
}
}
}
回答3:
According to the answer available here. The only solution is to copy an existing empty mdb, connect to this and create tables etc. No way to create a mdb from code !
来源:https://stackoverflow.com/questions/19263937/creating-a-new-ms-access-file-in-java-using-jackcess