我正在创建一个桌面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();
}
}发布于 2015-09-18 22:22:50
建议:
我建议您存储与数据库相关的参数/配置
等等,在中。然后,您可以使用执行。你只需要确保两件事-
这里有一个具体的例子(在Ubuntu Linux上测试)。
假设我们有一个:
存储在名为shared_dir的共享目录/path/to/sharedDirectory
Foo.mdb的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();
}
}
}
}再一次:
如果将数据库移动到不同的共享目录,请设置accordingly.的值;如果重命名共享目录,请设置sharedFolderName的值;如果重命名数据库,请设置databaseName accordingly.
pathToDB的值发布于 2015-09-18 08:02:22
最简单的解决方案是将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", "", "")https://stackoverflow.com/questions/32641670
复制相似问题