繁体   English   中英

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

[英]Connect Java to Access DB on network drive

我正在创建一个桌面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();
    }

}

建议:

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

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

等在属性文件中 然后,您可以使用getResourceAsStream 加载属性文件 您只需要确保两件事-

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

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

假设我们有一个:

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

MyDatabaseProperties.properties:

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

表定义:

在此处输入图片说明

例:

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相应。

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

例如,如果Java类(或将程序打包到其中的jar)驻留在c:\\ share \\ foo.class(或c:\\ share \\ foo.jar),则将acdb文件放在同一目录中结构,例如c:\\ share \\ database \\ Database11.accdb。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM