【问题标题】:Connect Java to Access DB on network drive将 Java 连接到网络驱动器上的 Access DB
【发布时间】: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();
    }

}

【问题讨论】:

    标签: java ms-access ucanaccess


    【解决方案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.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 的值。

    【讨论】:

      【解决方案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 脚本,但我对学习很感兴趣,但是,我没有任何运气在谷歌上搜索它。你能提供一些指导或一个好的教程的链接吗?也许我在搜索错误的关键词。
      猜你喜欢
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2013-04-15
      相关资源
      最近更新 更多