2

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.

3 Answers 3

1

If you want to create a new database, you need to call DatabaseBuilder.create(), not open() (which opens an existing database).

Sign up to request clarification or add additional context in comments.

Comments

1

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();
        }
    }

}

Comments

0

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 !

3 Comments

According to the answer you have mentioned you can use DAO , ADOX to create DB
@4dmonster: That is not for java. That is for VB.
Is it impossible for java to create COM/ActiveX object on windows?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.