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

Posted

技术标签:

【中文标题】将 Java 连接到网络驱动器上的 Access DB【英文标题】:Connect Java to Access DB on network drive 【发布时间】:2015-09-17 23:42:50 【问题描述】:

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

整个东西将位于共享网络驱动器上。

我使用绝对文件路径连接到我的数据库。我希望这个数据库能比我在办公室的任期更长。当另一个用户移动数据库或更改文件夹名称等时会发生什么......我是办公室里唯一的 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();
    


【问题讨论】:

【参考方案1】:

建议:

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

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

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

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

这是一个具体的例子(在 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.***.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://***.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 的值。

【讨论】:

【参考方案2】:

最简单的解决方案是将 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", "", "")

【讨论】:

需要注意的是,这样的相对路径不一定是相对于主类文件(或JAR文件)所在的文件夹。它将相对于在操作系统级别生效的当前工作目录。因此,为了使这种方法正常工作,必须使用批处理文件、shell 脚本或在启动 Java JVM 之前设置当前工作目录的快捷方式来启动 Java 应用程序。否则,数据库路径将与启动 Java 应用程序时发生的任何正确工作目录相关。 戈德,我相信你是对的。我根据吉尼斯的回复找到了数据库,相对路径给了我一个错误,而绝对路径没有。我不知道如何编写 shell 脚本,但我对学习很感兴趣,但是,我没有任何运气在谷歌上搜索它。你能提供一些指导或一个好的教程的链接吗?也许我在搜索错误的关键词。

以上是关于将 Java 连接到网络驱动器上的 Access DB的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ODBC 驱动程序将 Java 程序连接到 Access 2010 数据库

将 MS Access 连接到网络上的 SQL Server

如何使用映射的网络驱动器通过数据源 (ODBC) 连接到 Access 数据库?

PHP:远程连接到 MS Access 2013

如何在 VB.net 中连接到本地网络上的 Access 数据库?

将 JDBC 驱动程序连接到 MSSQL 数据库时出现问题