荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: icefire (......), 信区: Java
标  题: 用JDBC 编 写 查 询Access 和FoxPro 数 据 库
发信站: BBS 荔园晨风站 (Mon Feb  1 09:29:01 1999), 站内信件 (WWW POST)

用JDBC 编 写 查 询Access 和FoxPro 数 据 库
李 元
( 贵 州 大 学 计 算 机 软 件 与 理 论 研 究 所, 贵 阳550025)
Email: lixiang@gzu.edu.cn
WWW: http://www.gzu.edu.cn/~lixiang/index.html

--------------------------------------------------------------------------------

---- JDBC(Java 数 据 库 连 接:Java Database Connectivity ) 是 用 于 执 行
SQL 语 句 的Java 应 用 程 序 接 口(Java Application Programming Interface:
Java API), 它 由 一 组 用Java 语 言 写 的 类 与 接 口 组 成。JDBC 是 一 种 规
 范, 其 宗 旨 是 让 各 数 据 库 开 发 商 为Java 程 序 员 提 供 标 准 的 数 据
库 访 问 类 和 接 口。JDBC 与Java 结 合, 使 用 户 可 以 很 容 易 地 把SQL 语 句
 传 送 到 任 何 关 系 数 据 库 中, 程 序 员 用 它 编 写 的 数 据 库 应 用 软 件
, 可 在 各 种 数 据 库 系 统 上 运 行。 本 文 通 过 一 个 实 例 讨 论 用JDBC 编
 写 在 中 文Win95 下 访 问Access( 包 括Access2.0, Access7.0) 和FoxPro( 包 括
FoxPro2.6, FoxBase2.1, dBase3.0, dBase4.0 等) 数 据 库 的Java 应 用 程 序, 从
 中 体 会JDBC 在 数 据 库 应 用 上 实 现" 一 次 编 程, 处 处 运 行" 的 功 能,

安 装JDBC
---- JDBC 类 库 已 放 入JDK1.1, 若 使 用JDK1.1, 则 无 须 安 装JDBC 及 下 面 的
JDBC-ODBC; 因 目 前JDK1.1 暂 不 支 持 中 文, 固 本 文 主 要 介 绍 使 用
JDK1.02 时 的JDBC 访 问 数 据 库 编 程, 此 时 需 要 安 装JDBC, 可 通 过 访 问
 下 列 地 址 获 得JDBC 软 件 包( 目 前 已 有JDBC1.2 版, 本 文 使 用JDBC1.1):

---- http://splash.javasoft.com/jdbc/

---- 得 到JDBC 软 件(Windows 的zip 文 件) 包, 用WinZip 解 压, 生 成 目 录
JDBC,JDBC 的 所 有 内 容 都 在 这 个 目 录 中。

---- 为 在 编 译Java 程 序 时 调 用JDBC 得SQL 类 库, 应 在autoexec.bat 批 处 理
 文 件 中 环 境 变 量 的:\jdbc\classes。

建 立 数 据 库 和 设 置 数 据 源
---- Access 具 备 完 善 的 数 据 库 功 能, 可 以 作 为 独 立 的DBMS 使 用, 是
PC 微 机 上 开 发 客 户/ 服 务 器 型 数 据 库 应 用 的 优 秀 工 具;FoxPro(
FoxBase、dBase) 是 国 内PC 微 机 用 户 常 用 的 数 据 库 软 件, 已 用 它 建 立
 了 大 量 数 据 库 挡 案 资 料; 讨 论 用Java SQL API 编 写 访 问Access 和
FoxPro 数 据 库 的Java 应 用 程 序 是 十 分 有 意 义 的。
---- 现 在 对 概 念 已 作 了 根 本 的 修 改: 传 统 的( 例 如:dBase3.0、
FoxBase、FoxPro2.6 等) 用 于 存 贮 数 据 的*.dbf 文 件 不 再 被 称 为 数 据 库
 而 被 称 为 表(table)。Access 将 若 干 个 相 关 联 的 表(Table) 组 成 一 个
数 据 库(.mdb), 每 一 个 表 相 当 于 通 常(Foxbase,Foxpro,dBase) 定 义 的 一 个
 数 据 库(.dbf); 而 对FoxPro(FoxBase、dBase), 则 将 放 在 某 个 目 录 里 的
 所 有 相 关 联 的*.dbf 文 件 看 作 一 个 相 当 于Access 的*.mdb 的 数 据 库。
在 下 面 的 例 子 里, 我 们 要 使 用 的 数 据 库 有 两 个 表:table1 与table2;


table1
编 号 软 件 名 姓 名 通 信 地 址 电 话
1 Access7.0 赵 一 北 京 (01)623-2731
2 Access7.0 钱 二 上 海 (21)443-6998
3 Access7.0 孙 三 天 津 (22)578-8535
4 Access7.0 李 四 长 春 (431)885-9854


table2 如 下: SupplierID Software SupplierName Address PhoneNumber
1 Access7.0 Piter France (33)687-9354
2 Access7.0 John America (1)675-4398
3 Access7.0 Tanaka Japen (81)854-3952
4 Access7.0 Hesai Mexico (52)257-5793


---- 如 下 建 立 数 据 库 与 数 据 源:

---- 1 用Access7.0 建 立 名 为acs70db.mdb 的 数 据 库 文 件, 其 中 建 有 上 面
 两 个 表; 将 文 件acs70db.mdb 存 盘 到 目 录c:\datas\acs70 中; 数 据 源 名 为
acs70db.mdb;

---- 2 用Access2.0 建 立 名 为acs20db.mdb 的 数 据 库 文 件, 其 中 建 有 上 面
 两 个 表; 将 文 件acs20db.mdb 存 盘 到 目 录c:\datas\acs20 中; 注 意 此 时 表
table1 的 字 段 名 要 改 用 英 文; 数 据 源 名 为acs20db.mdb;

---- 3 用FoxPro2.6 将 上 面 两 个 表 分 别 建 为 文 件table.dbf 与table2.dbf,
并 将 这 两 个 文 件 存 盘 到 目 录c:\datas\foxp26 中;

---- 4 用FoxBase2.1 将 上 面 两 个 表 分 别 建 为 文 件table.dbf 与table2.dbf,
 并 将 这 两 个 文 件 存 盘 到 目 录c:\datas\foxb21 中;

---- 5 用dBase3.0 将 上 面 两 个 表 分 别 建 为 文 件table.dbf 与table2.dbf, 并
 将 这 两 个 文 件 存 盘 到 目 录c:\datas\dbs3 中;

---- 上 列 数 据 库 制 好 后, 打 开Win95 的" 设 置" 菜 单 中 的" 控 制 面 板敚
* 从 中 启 动 微 软 的ODBC 设 置 相 应 的ODBC 驱 动 器 和 数 据 源( 下 面 分 别
 用axs70、acs20、foxp26、foxb21 和dbs3 作 数 据 源 名)。

配 置JDBC-ODBC 驱 动 器
---- ODBC( 开 放 式 数 据 库 互 连:Open Database Connectivity) 是 用C 语 言
写 的 在 多 种 不 同 的DBMS( 数 据 库 管 理 系 统) 中 存 取 数 据 的 标 准 应
 用 程 序 接 口; 目 前 应 用 最 广 的 是 微 软 的ODBC, 它 几 乎 可 将 所 有 平
 台 的 所 有 数 据 库 连 接 起 来。ODBC 在 应 用 程 序 与 特 定 数 据 库 之 间
插 入 一 个 驱 动 程 序 管 理 器, 每 种 数 据 库 引 擎 都 需 要 向 驱 动 程 序
 管 理 器 注 册 它 自 己 的ODBC 驱 动 程 序, 驱 动 程 序 管 理 器 将 与ODBC 兼
 容 的SQL 请 求 从 应 用 程 序 传 给ODBC 驱 动 程 序 并 由ODBC 驱 动 程 序 把
SQL 请 求 翻 译 为 对 数 据 库 的 固 有 调 用, 从 而 达 到 应 用 程 序 访 问 操
 作 数 据 库 的 目 的。
---- JDBC 采 用JDBC-ODBC 桥 接 方 式 使Java 应 用 程 序 使 用ODBC。JDBC-ODBC
Bridge 软 件 包 可 通 过 下 列 地 址 得 到:

---- http://splash.javasoft.com/jdbc/

---- 用WinZip 解 压 后 形 成jdbc-odbc 目 录, 目 录 中 包 括 了 所 需 内 容, 同
 时 在autoexec.bat 批 处 理 文 件 中 将揷:\jdbc-odbc\classes" 加 进搒et
CLASSPATH厖" 中; 将揷:\jdbc-odbc\classes\sun\jdbc\odbc" 加 进搒et PATH厖" 中**

使 用SQL
---- SQL( 结 构 化 查 询 语 言:) 提 供 了 一 个 查 询 不 同 数 据 源 数 据 的
 标 准 方 式, 在1986 年 被 采 纳 为 工 业 标 准, 在1992 年 经 全 面 调 整 后
称 为SQL92( 或SQL2), 目 前SQL3 正 处 于 研 制 中。 下 面 简 要 介 绍SQL 的 主
 要 命 令 及 其 意 义:
---- COMMIT: 大 多 数 关 系 数 据 库 系 统RDBMS 以 事 务 为 处 理 单 位, 一 个
 事 务 可 包 含 多 个 动 作。COMMIT 命 令 指 示 数 据 库 记 录 到 当 前 点 时 执
 行 的 所 有 动 作 和 重 置 事 务;
---- INSERT: 指 示 数 据 库 在 表 中 插 入 行;
---- DELETE: 指 示 数 据 库 在 表 中 删 除 行;
---- SELECT: 指 示 数 据 库 从 表 中 返 回 行;
---- UPDATA: 指 示 数 据 库 修 改 表 中 的 行。

编 写 访 问 数 据 源 的Java 应 用 程 序
---- 很 容 易 用JDBC 编 写 访 问、 操 作 数 据 库 的Java 应 用 程 序; 应 用 程
 序 一 般 作 下 面 三 件 事:
---- (1) 加 载JDBC-ODBC bridge 驱 动 程 序;

---- (2) 建 立 与 数 据 库 的 连 接、 发 送 访 问、 操 作 数 据 库 的SQL 语 句


---- (3) 处 理(2) 对 数 据 库 访 问、 操 作 的 结 果。

---- 对 此, 可 如 下 使 用Class.forName 方 法 显 式 加 载 驱 动 程 序 来 完 成
(1):

---- Class.forName("sun.jdbc.odbc.JdbsOdbcDriver");

---- 为 使 程 序 通 用, 编 写 一 个 方 法( 函 数) 来 完 成(2):

---- static ResultSet creatResultSet(String s1,String s2)

---- 该 方 法 中 的 两 个 参 数 是 字 符 串s1( 数 据 源 名) 与s2(SQL 语 句)
, 返 回 对 数 据 源s1 进 行s2 访 问 操 作 的 结 果; 因 此 调 用 该 方 法 即 实
 现" 与 数 据 源s1 连 接 并 向 其 中 进 行s2 的SQL 查 询 并 返 回 查 询 结 果敗
* 为 完 成**3), 设 计 方 法:

---- static void showResultSet(ResultSet rs)

---- 该 方 法 将 查 询 结 果rs 在 屏 幕 上 显 示 出 来。

---- 综 上, 我 们 在 下 面 的 源 程 序 中 调 用 方 法creatResultSet(String s1,
String s2) 两 次: 一 次 查 询FoxPro2.6 数 据 库 的 表 二, 另 一 次 查 询
Access7.0 数 据 库 的 表 一; 并 调 用 方 法showResultSet(ResultSet rs) 将 结 果
 显 示( 见 附 图):

class test{
  public static void main(String args[]) {
        try {
        //数据源与查询语句:
         String sjy1="acs70",sjy2="acs20",sjy3="foxp26",
               sjy4="foxb21",sjy5="dbs3";
            String sql1="SELECT * FROM table1 WHERE编号<5";
            String sql2="SELECT * FROM table2 WHERE SupplierID<5";
        //加载(sun公司的)JDBC-ODBC bridge驱动程序:
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        //与数据源sjy*连接进行sql*查询,返回查询结果rs1:
            ResultSet rs1=creatResultSet(sjy3,sql2);
            ResultSet rs2=creatResultSet(sjy1,sql1);
        //显示查询结果:
            System.out.println("\n下面是您查询FoxPro2.6
                            数据库的结果: ");
            System.out.println("=================== ");
            showResultSet(rs1);
            System.out.println("====================");
            System.out.println("\n下面是您查询Access7.0数据库的结果: ");
            System.out.println("=================== ");
            showResultSet(rs2);
            System.out.println("====================");

        //关闭对象:
            rs1.close();rs2.close();
        }
        catch (SQLException ex) {
            System.out.println("\n***SQL异常!***\n");
        }
        catch (java.lang.Exception ex){
          ex.printStackTrace();
        }
  }
  //与数据源s1连接并向其中进行s2的SQL
   查询并返回查询结果的方法:
  private static ResultSet creatResultSet(String s1,String s2)
                      throws SQLException {
        //指定数据源:
            String datasr=s1;  //数据源名
        //建立与数据的连接:
            //与数据源datasr连接
         (因方法getConnection为静态的,故以类名调用):
            Connection con1 = DriverManager.getConnection
                           ("jdbc:odbc:"+datasr);
            System.out.println("\nOK!连接成功!");
        //发送SQL语句,对数据源进行操作:
            //要执行SQL查询语句,首先需创建Statement对象:
            Statement stmt1=con1.createStatement();
        //对数据源中的数据表tables在Statement对象上
          使用方法executeQuery执行一个查询语句:
            //该语句将在rs1中返回表中的所有行(记录):
            return stmt1.executeQuery(s2);
  }

  private static void showResultSet(ResultSet rs)
                      throws SQLException {
    int i;
    String tmpstr;
    ResultSetMetaData rsmd = rs.getMetaData();
    int numCols =rsmd.getColumnCount();
    //
    for(i=1;i<=numCols;i++){
        if(i>1)System.out.print(", ");
        System.out.print(rsmd.getColumnLabel(i));
    }
    System.out.println("");
    System.out.println("------------------- ");
    //
    while(rs.next()){
        for(i=1;i<=numCols;i++){
            if(i>1)System.out.print(", ");
            tmpstr=rs.getString(i);
            if(rs.wasNull())System.out.print("NULL");
            else System.out.print(tmpstr);
        }
        System.out.println("");
    }
  }
}

--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.30]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店