我正在创建一个桌面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();
}
}
答案 0 :(得分:1)
我建议你存储数据库相关的参数/配置
等。在 properties file 中。然后,您可以使用 load the properties file getResourceAsStream 。你只需要确保两件事 -
这是一个具体的例子(在Ubuntu Linux上测试过)。
我们说有一个:
Foo.mdb
/path/to/sharedDirectory
的MS Access数据库
shared_dir
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
的值。答案 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", "", "")