【问题标题】:Access (.mdb) Database manipulation with jdbc使用 jdbc 访问 (.mdb) 数据库操作
【发布时间】: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 虽然我同意你的观点,但当其他人支付账单时,如果他们想要访问权限,他们就会获得访问权限、伤害世界等等。

标签: java database ms-access jdbc odbc


【解决方案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。
在这种情况下,请查看以下内容:

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。
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 2021-10-10
  • 2023-03-18
  • 2011-03-20
  • 1970-01-01
  • 2018-06-17
  • 2015-03-10
  • 1970-01-01
相关资源
最近更新 更多