使用 jdbc 访问 (.mdb) 数据库操作
Posted
技术标签:
【中文标题】使用 jdbc 访问 (.mdb) 数据库操作【英文标题】:Access (.mdb) Database manipulation with jdbc 【发布时间】:2012-03-29 00:39:44 【问题描述】:背景:开发要在 Network Solutions 托管的 Apache 服务器上运行的应用程序。朋友/客户坚持使用 Access 数据库而不是 SQL 数据库。
当前问题:编写了一个 Java 测试程序,以确保在我开始编写整个后端之前可以连接到数据库。当我在 apache 服务器的 JVM 上运行此代码时,最终产品将被托管:
import java.sql.*;
import java.io.*;
public class test
public static void main(String[] args)
try
Class driverClass = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
DriverManager.registerDriver((Driver) driverClass.newInstance());
// set this to a MS Access DB you have on your machine
String filename = new File(".").getCanonicalPath() + "/ITEMS.mdb";
String database = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=";
database+= filename.trim(); // add on to the end
// now we can get the connection from the DriverManager
System.out.println(database);
Connection conn = DriverManager.getConnection( database );
catch (Exception e)
System.out.println("Error: " + e.getMessage() + " " + e.getLocalizedMessage());
e.printStackTrace();
我在 Connection conn= DriverManager.getConnection(database) 行上得到一个空指针异常
这是堆栈跟踪:
java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java:436)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:153)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at test.main(test.java:20)
为了编写这个测试,我把它作为我的主要来源:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2691&lngWId=2
【问题讨论】:
MS-Access 只能在 Windows 服务器上运行。 MS-Access 也是一个“桌面”数据库——而不是多用户数据库。如果您将访问权限暴露给网络,那么您将进入一个受伤的世界。帮自己一个大忙,将所有数据移动到真正的多用户数据库,如 Postgresql 或 mysql。 @GreyBeardedGeek 虽然我同意你的观点,但当其他人支付账单时,如果他们想要访问权限,他们就会获得访问权限、伤害世界等等。 【参考方案1】:String strconnect="jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ="
Sring filename="some path";
StringBuilder a =new StringBuilder();
a.append(strconnect);
a.append(filename);
String db = a.toString();
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c= DriverManager.getrConnection(db,"","")
Statement stmt = c.createStament();
String query = "some query";
stmt.executeQuery(query);
c.close();
从不获取规范路径,要么指定访问文件的路径,要么使用 JFile 探索并获取路径
也别忘了关闭连接
【讨论】:
显式 StringBuilder 是不必要的。String db = strconnect + filename;
将自动为您创建一个字符串生成器。使它更清洁。 :)
你是对的,但有些情况包括特殊字符,所以 StringBuilder 是安全的方式
其实它们是一样的。当您在 Java 中对 String 使用 +
或 +=
运算符时,编译器会将 StringBuilder 放入生成的字节码中。所以无论你是否使用 + 运算符,你都在使用 StringBuilder。
好吧,那很好,但是使用 String builder 有什么问题吗。【参考方案2】:
既然你提到了 apache,我就假设服务器运行的是 Linux 或 BSD。 在这种情况下,请查看以下内容:
Connecting to access database from linux 好Linux ODBC drivers for Access好贵! (单台机器 850 美元!)Linux 上没有为 Access 提供默认驱动程序,除非您安装一个,否则 JDBC ODBC 将无法工作。
除非有非常特殊且压倒性的好理由使用 Access 数据库作为 linux 服务器上网站的后端,否则请告诉您的朋友,这在技术上甚至在经济上都不一致。
如果您需要服务器上的轻量级数据库,请使用SQLite:它是免费的,对connecting to it from Java in linux 有很好的支持,有很好的工具(甚至是browser plugins),如果您的您可以随时使用convert that database to Access朋友想偶尔获得一次 Access 备份。
否则,请像所有人一样选择 PostgreSQL 或 MySQL(通常是有充分理由的)。
【讨论】:
我认为假设如果您正在运行 Apache,那么您也在运行 Unix 操作系统是一个糟糕的决定。有很多商店在运行 Windows 并仍在运行 Apache。以上是关于使用 jdbc 访问 (.mdb) 数据库操作的主要内容,如果未能解决你的问题,请参考以下文章
关于 MariaDB 的 JDBC 故障转移/高可用性的说明