将 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 数据库?