使用 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) 数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

java直接存取MS Access的mdb数据库文件

关于 MariaDB 的 JDBC 故障转移/高可用性的说明

使用JDBC-ODBC连接Access数据库

访问错误 3443:无法识别的数据库格式“databasename.mdb”

使用 php 访问 MDB

通过JDBC访问数据库