将Java连接到网络驱动器上的Access DB

时间:2015-09-17 23:42:51

标签: java ms-access ucanaccess

我正在创建一个桌面Java应用程序,它将使用ucanaccess作为驱动程序连接到访问数据库。

整个内容将位于共享网络驱动器上。

我使用绝对文件路径连接到我的数据库。我希望这个数据库能够在办公室任职时间超过我的任期。当另一个用户移动数据库,或者更改文件夹的名称等等时会发生什么...我是办公室里唯一的Java怪人,所以这需要在某种程度上自动化,或者对于那些......的人来说很容易做到只是说不懂电脑。

我正在寻找有关如何解决这个问题的想法。我想打开一个文件对话框并让用户选择文件的位置,但这似乎对我工作的那种人来说太多了。它应该打开......

非常感谢任何帮助。代码示例如下。

package databaseTest;

import java.sql.Connection;
import java.sql.DriverManager;

public class test {

    public test() {
        try {
            String driver = "net.ucanaccess.jdbc.UcanaccessDriver";
            Class.forName(driver);
            Connection cnct = DriverManager.getConnection("jdbc:ucanaccess://c:\\users\\Christopher\\Desktop\\JavaProject\\Database11.accdb", "", "");
            System.out.println("Connected");
        } catch(Exception ex) {System.out.println(ex.getMessage());}
    }

    public static void main(String[] args) {
        System.out.println("connecting...");
        new test();
    }

}

2 个答案:

答案 0 :(得分:1)

建议:

我建议你存储数据库相关的参数/配置

  • 数据库路径
  • 网络共享目录的名称
  • 数据库名称

等。在 properties file 中。然后,您可以使用 load the properties file getResourceAsStream 。你只需要确保两件事 -

  • 属性文件位于项目构建路径中的目录中。
  • 如果更改了任何参数(移动/重命名文件),属性文件中的相应值也会更改。

这是一个具体的例子(在Ubuntu Linux上测试过)。

我们说有一个:

  • 存储在共享目录Foo.mdb
  • 下的名为/path/to/sharedDirectory的MS Access数据库
  • 名为shared_dir
  • 的共享目录

MyDatabaseProperties.properties:

pathToDB = /path/to/sharedDirectory
sharedFolderName = shared_dir
databaseName = Foo.mdb

表定义:

enter image description here

实施例

package com.stackoverflow.questions.Q32641670;


import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;


/**
 * Initializes a connection to an MS-Access DB using JDBC/UCanAccess API, inserts a record and closes the connection.
 * <p>
 * ADDITIONAL JARS REQUIRED:
 * ------------------------
 * commons-lang-2.6.jar
 * commons-logging-1.1.1.jar
 * hsqldb.jar
 * jackcess-2.1.0.jar
 * ucanaccess-2.0.9.5.jar
 *
 * @see @link {https://stackoverflow.com/questions/32641670/connect-java-to-access-db-on-network-drive}
 * @since 18/9/15.
 */


/**
 * @author Sandeep Chatterjee
 * @version 1.0
 */
public class ConnectRemoteDB {

    /**
     * @param args The command line arguments
     */
    public static void main(String[] args) throws IOException {

        initializeConnection();

    }

    /**
     * Initializes remote database connection and inserts a record and closes the connection.
     */
    private static void initializeConnection() throws IOException {

        System.out.println("Attempting Database Connection...");

        Connection connection = null;

        PreparedStatement preparedStatement;

        try {

            final Properties PROPERTIES = new Properties();

            InputStream inputStream = ConnectRemoteDB.class.getResourceAsStream("/MyDatabaseProperties.properties");

            PROPERTIES.load(inputStream);

            String pathToDB = PROPERTIES.getProperty("pathToDB");

            String sharedFolderName = PROPERTIES.getProperty("sharedFolderName");

            String databaseName = PROPERTIES.getProperty("databaseName");

            String connectionString = "jdbc:ucanaccess:///" + pathToDB + "/" + sharedFolderName + "/" + databaseName;

            connection = DriverManager.getConnection(connectionString, PROPERTIES);
            System.out.println("CONNECTION ESTABLISHED....");
            String insertTableSQL = "INSERT INTO Table1" + "(Name) VALUES"
                    + "(?)";
            preparedStatement = connection.prepareStatement(insertTableSQL);
            preparedStatement.setString(1, "A");
            preparedStatement.executeUpdate();
            System.out.println("RECORD INSERTED...");

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                connection.close();
                System.out.println("CONNECTION CLOSED...");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

再次:

  • 如果将数据库移动到其他共享目录,请相应地设置pathToDB的值。
  • 如果重命名共享目录,请相应地设置sharedFolderName的值。
  • 如果重命名数据库,请相应地设置databaseName的值。

答案 1 :(得分:0)

最简单的解决方案是将accdb文件放在相对于java类的位置,而不是使用绝对路径。

例如,如果java类(或者你已经将程序打包成jar的话)驻留在c:\ share \ foo.class(或c:\ share \ foo.jar),那么将acdb文件放入相同的目录结构,例如C:\共享\数据库\ Database11.accdb。

然后,您可以在连接字符串中使用相对路径:

 Connection cnct = DriverManager.getConnection("jdbc:ucanaccess:database/Database11.accdb", "", "")