使用 Apache Derby 开发 Perl 应用程序

来源:百度文库 编辑:神马文学网 时间:2024/04/30 00:43:41

概述

要使用 Perl 访问数据库,就需要用到 Perl 数据库接口( DBI),这是用于 Perl 的一个开源组件。DBI 支持 Perl 与第三方数据库的集成,例如 IBM® Cloudscape™ 或 Derby。DBI 定义了访问数据库的方法、变量以及约定。为了访问特定的数据库,除了需要 DBI 之外,还需要一个 Perl Database Driver (DBD)。有多种可用于各种数据库的 DBD,要访问某一个数据库,需要同时使用 DBI 和特定于数据库的 DBD。使用 Perl 访问数据库的另一种方法是使用 DBI 和 DBD-ODBC 模块,后者使用 ODBC,而不是使用本地的 DBD。目前还没有专用于 Derby 的 DBD,因此,访问 Derby 数据库时需要使用 DBD-ODBC 模块。Derby 通过 IBM DB2™ Run-time Client 获得 ODBC 支持。

IBM CloudscapeApache Derby 开源数据库的商业发行版。

Perl 是一种通用的、功能强大的脚本语言,常用于 Web 开发。利用 Perl 中提供的对数据库的支持,可以很容易地从 Perl 访问 Derby 数据库。通过使用 ODBC 以及 Perl DBI 和 DBD-ODBC 模块,就可以从 Perl 访问 Derby 数据库。

在本文中,您将亲历安装和配置用 Perl 访问 Derby 数据库所需的各种组件的每一个步骤。首先要安装和配置 IBM DB2 ODBC 驱动程序,以连接和创建 Derby 数据库的数据源。接着,将学习如何在 Windows 上安装 Perl、Perl DBI 以及 Perl DBD-ODBC 组件。至此,所有预备工作便告完成,然后就可以创建访问 Derby 数据库的 Perl 脚本。本文包括一个示例脚本,用以演示上述过程。





回页首

软件需求

本节中描述的软件可以免费下载。

安装下面列出的 某一种数据库:

  1. Cloudscape 10.0 (包括了 IBM DB2 Java Database Connectivity (JDBC) Universal Driver)
  2. Apache DerbyIBM DB2 JDBC Universal Driver

另外,安装下面列出的 所有软件:

  • Perl 本技术文章中给出的安装说明已使用 ActivePerl version 5.8.4.810 进行了测试。
  • IBM DB2 ODBC
  • Perl DBI 组件 本技术文章中的安装说明已使用 1.4.3 Perl DBI 组件进行了测试。
  • Perl DBD-ODBC 组件. 本技术文章中的安装说明已使用 1.10 Perl DBD-ODBC 组件进行了测试。




回页首

配置 IBM DB2 ODBC 客户机

为了与 Derby 数据库一起使用 IBM DB2 ODBC 驱动程序,IBM DB2 客户机软件需要知道 Derby 数据库所在的位置和名称,还需要知道它是一个 ODBC 数据源。本节将展示如何通过 编目节点 来提供所有这些信息。

本节中的说明作了如下假设:

  • Derby Network Server 运行在默认端口 1527 上。
  • 您已经创建了一个名为 DB1 的 Derby 数据库。

首先,标识远程数据库所在的主机和端口。在这里,Derby 数据库运行在本地机器("localhost")上,Network Server 在默认端口 1527 上进行监听。接下来,要为该节点提供一个名称,例如 CNS

打开 db2cmd 窗口并编目 CNS 节点,以访问 localhost、端口 1527,如下所示:

db2 catalog tcpip node CNS remote localhost server 1527            

接下来,提供将在 CNS 节点上访问的数据库名,如下所示:

db2 catalog db DB1 at node CNS authentication server            

最后,将数据库编目为一个 ODBC 数据源。您可以通过 Windows ODBC Data Source Administrator 或者使用 CLP 命令来完成这项操作,如下所示:

db2 catalog system odbc data source DB1            

为了检查上述步骤是否有效,需要发出以下命令为 DB1 数据库创建 ODBC 数据源:

db2 list system odbc data sources            

如果上述步骤有效,那么您将看到 DB1 Data source name existing of type IBM DB2 ODBC DRIVER 的确认。

如果节点或数据库已经被编目,那么上面显示的命令将失败。如果遇到错误,可使用下面展示的 DB2 UDB 命令取消它们的编目并回到最初:

db2 uncatalog node CNS            db2 uncatalog db DB1            

若需查看对 IBM DB2 UDB catalog 命令的完整描述,请参阅 IBM DB2 Universal Database Command Reference

用 Derby 验证 ODBC

确定 ODBC 是否能连接到刚才建立的 Derby 数据源 DB1 的一种快捷方法是使用 Windows 中的 ODBC Data Sources 工具。如果是在 Windows XP 中,可以通过 Start --> Control Panel --> Administrative Tools --> Data Sources (ODBC) 来访问该工具。这将弹出 ODBC Data Source Administrator 窗口。选择 ‘System DSN’ 标签页,如果已经正确地编目了 DB1 Data Source,那么可以在这个列表中看到它。

选择 ‘Name‘ 列下的 DB1,并单击左边的‘Configure...’按钮。您将看到一个类似下图的窗口。



图 1. 确认到 Derby 数据源的 ODBC 连接

确保 Cloudscape Network Server 运行在端口为 1527 的本地主机上,填充 ‘User ID‘ 和 ‘Password‘ 的值,然后单击 Connect 按钮,以测试到 Cloudscape Data Source ‘DB1‘ 的连接。如果连接成功,系统将弹出一个对话框,通知连接成功。





回页首

安装 Perl

访问 http://www.perl.org/。选择 ‘Get Perl‘,然后在 ‘Download Perl Distributions‘ 部分选择 ‘ActivePerl for Windows,Solaris, Linux‘。在接下来的页面中单击 Download 链接,进行注册,然后将 zip 文件下载到一个临时目录中。

将 ActivePerl-5.8.4.810-MSWin32-x86.zip 文件解压到某个目录中。完成解压操作之后,运行 installer.bat 文件。不要在已经安装了 5.6 版 ActivePerl 的系统中安装 5.8.x 版的 ActivePerl。ActivePerl 5.8 解压后所在的目录中有一个 RELEASE.txt 文档,其中包含了关于安装 ActiveState Perl 的更多信息。

确保在 PATH 环境变量的开头有 Perl 5.8 版本信息。否则,您可以选择一个更老的 Perl 版本,例如 MKS 包中的那个 Perl 版本。

Perl 的配置至此已告完成。现在从命令行执行一个简单的脚本来测试安装是否成功。





回页首

从命令行测试 Perl

清单 1 中的代码是一个简单的 Perl 脚本,用于测试 Perl 环境。



清单 1: 一个示例 Perl 脚本
# hello-world.pl            use strict;            print "Where would we be without Hello World?";            

将清单 1 中的内容复制到名为 hello-world.pl 的文件中,然后将其保存到任何目录中。在执行该脚本之前,应确保 perl.exe 在当前路径中。下面是运行 hello-world.pl 文件的命令以及运行该脚本得到的输出。

C:\temp>perl hello-world.pl            Where would we be without Hello World?            





回页首

安装 DBI 模块

Perl DBI Module 是用于 Perl 的数据库接口。要从 Perl 建立任何到第三方数据库的数据库连接,都需要这个接口。为了下载、安装和配置该模块,可以使用刚才安装的 ActiveState perl 发行版附带的 Perl Package Manager (ppm)。ppm 需要访问 Internet 来下载和安装这些包。如果已经安装了防火墙软件,那么可能需要设置一些环境变量才能正确使用 ppm。如果必须使用 ppm 变量来安装 DBI 模块,那么在安装说明之后会有关于这些变量的注意事项。

使用 ppm 安装 DBI

  • 打开一个命令窗口,输入 perl -version,测试您是否正在使用适当的 perl 版本。如果您安装了前面提到的版本,那么 perl release 应该是 5.8.4。要使本文中的所有步骤都能成功完成,需要安装 5.6 或更高的版本。
  • 接着,在提示符后面输入 ppm ,进入 ActiveState Perl 附带的 Perl 包管理器。
  • 为了安装 DBI 组件,只需在 ppm 提示符后面输入 install DBI 即可。
  • 这就行了!如果还有问题的话,请参阅 dbi.perl.org 站点上关于在 Windows 上安装 DBI 的 FAQ

下面是安装了 Perl DBI 的成功 ppm 会话的部分输出。

ppm> install DBI            ====================            Install ‘DBI‘ version 1.43 in ActivePerl 5.8.4.810.            ====================            Downloaded 513616 bytes.            Extracting 69/69: blib/arch/auto/DBI/Driver_xst.h            Installing C:\tools\perl\site\lib\auto\DBI\dbd_xsh.h            Installing C:\tools\perl\site\lib\auto\DBI\DBI.bs            Installing C:\tools\perl\site\lib\auto\DBI\DBI.dll            ...            ...            ...            Installing C:\tools\perl\bin\dbiprof.bat            Installing C:\tools\perl\bin\dbiproxy            Installing C:\tools\perl\bin\dbiproxy.bat            Successfully installed DBI version 1.43 in ActivePerl 5.8.4.810.            

如果正在运行防火墙软件,并且 ppm 无法下载 Perl Modules,那么可能需要设置以下环境变量。

表 1. ppm 无法下载 DBI Module 时所需的环境变量设置

set HTTP_proxy=address:port [e.g. 192.0.0.1:8080] set HTTP_proxy_user=username set HTTP_proxy_pass=password set HTTP_proxy_agent=agent [e.g. "Mozilla/5.0"]





回页首

安装 DBD-ODBC 驱动程序

要使所有软件协同工作,接下来的步骤是安装将与 DBI 组件一起使用的 DBD-ODBC 驱动程序。由于在 DB2 Run-time Client 中已包含了对 Derby 数据库中 ODBC 的支持,因此可以使用 DBD-ODBC 驱动程序与刚才安装的 DBI 组件进行会话。Perl Package Manager,即 ppm,将再次用于安装 DBD-ODBC Version 1.1.0。

  • 打开另一个命令提示符并输入 ppm
  • 现在输入 install DBD-ODBC

 

下面是运行该命名所得到的示例输出。

ppm> install DBD-ODBC            ====================            Install ‘DBD-ODBC‘ version 1.10 in ActivePerl 5.8.4.810.            ====================            Downloaded 76744 bytes.            Extracting 11/11: blib/arch/auto/DBD/ODBC/ODBC.lib            Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.bs            Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.dll            Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.exp            Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.lib            Installing C:\tools\perl\html\site\lib\DBD\ODBC.html            Installing C:\tools\perl\html\site\lib\DBD\ODBC\Changes.html            Files found in blib\arch: installing files in blib\lib into architecture depende            nt library tree            Installing C:\tools\perl\site\lib\DBD\ODBC.pm            Installing C:\tools\perl\site\lib\DBD\ODBC\Changes.pm            Successfully installed DBD-ODBC version 1.10 in ActivePerl 5.8.4.810.            





回页首

DBI 的架构和语法

DBI 的架构依赖于 DBI 编程接口来将 DBI 调用转送到 Database Driver,在这里是转送到 DBD-ODBC。使用 DBI 的主要目的之一是使得用于访问数据库的语法具有独立性。当 DBI 与适当的驱动程序一起使用时,可用于通过相同的标准语法访问多个数据库(甚至可以同时访问)。

下面的表中列出了一些常见的 DBI 约定和语法。

表 2. DBI 约定和语法

约定   意义 $dbh   数据库句柄 $sth   语句句柄 $rc   通用返回代码,boolean: true=ok, false=error $rows   所处理的行数,如果没有处理行,则为 -1 $sth->Finish()   在语句句柄使用完毕时调用的方法 $dbh-> Disconnect()   断开和销毁数据库句柄时调用的方法 $dbh->do()   用于非重复、非 SELECT 语句的方法 $sth->fetchrow_array   一个实用方法,用于取下一行数据,并将其以包含各字段值的列表的形式返回





回页首

测试到 Derby Network Server 的连接

在运行要连接到 Derby 数据库的 Perl 脚本之前,应使用 DB1 数据库和 ij(Derby SQL 脚本工具)确保到 Derby Network Server 的连接是成功的。如果无法使用 ij,则 Perl 脚本很可能也无法运行。下面显示了用来启动 Network Server 上 ijjava 命令,为了便于阅读,这个命令被分成数行:

C:\>java -Dij.driver=com.ibm.db2.jcc.DB2Driver            -Dij.protocol=jdbc:derby:net://localhost:1527/            -Dij.user=APP -Dij.password=APP  org.apache.derby.tools.ij            ij version 10.0 (C) Copyright IBM Corp. 1997, 2004.            ij> connect ‘DB1‘;            

如果 ij 命令失败,则应该检查:

  • CLASSPATH 的设置是否正确?
  • 是否启动了 Network Server?

如果 ij 测试成功了,那么就可以运行要连接到 Derby 数据库的 perl 脚本。





回页首

Perl、DBI、DBD-ODBC、ODBC 和 Derby!

本节将使用在前面已经安装和配置的所有组件。本节的示例 perl 脚本使用 DBI 调用 DBD-ODBC perl 驱动程序,而该驱动程序又使用 DB2 ODBC 驱动程序与 Derby Network Server 联系,后者连接到 Derby 数据库 DB1

下面显示的清单 2 包含一个示例 Perl 脚本,该脚本创建一个表,将一些行插入表中,并从表中取出一些行,然后删除该表,并断开与数据库的连接。其中,名为 DB1 的数据库是早先在 Window 的 ODBC Data Source 管理器中定义的。

将本清单中的内容复制到名为 perlExample.pl 的文件中。



清单 2: 从 Perl 访问 Derby 数据库 DB1
#perlExample.pl            use DBI;            use strict;            my $data_source = "DBI:ODBC:DB1";            my $user = "dbadmin"; my $password = "testpw";            # Create a database connection handle. Autocommit is On.            # $DBI::errstr - returns the native database engine error            # message from the last DBI method called            my $dbh = DBI->connect($data_source, $user, $password, {AutoCommit =>1})            or die "Can‘t connect to $data_source: $DBI::errstr";            # prepare a single CREATE SQL statement            my $sql = qq( CREATE TABLE STAFF(name VARCHAR(10),job VARCHAR(10)));            # execute the CREATE statement. The do() method can be used for            # non repeated non-SELECT statement.            $dbh->do($sql);            # prepare a single INSERT SQL statement containing literal values. Inserts 2 rows.            my $sql = qq(INSERT INTO STAFF( name, job)            VALUES ( ‘Pearce‘, ‘Clerk‘), (‘Hachey‘, ‘Mgr‘));            # execute the INSERT statement            $dbh->do($sql);            # prepare an INSERT SQL statement that contains parameter markers. Inserts one row.            # This is an example of a SQL statement being prepared once. The bind values            # for each row are provided to the execute method each time it is called.            # The statement does not need to be re-prepared for each row. The application            # typically runs faster.            my $sth = $dbh->prepare(q{INSERT INTO STAFF (name, job) VALUES (‘Smith‘, ?)})            || die $dbh->errstr;            # bind the parameter value            my $value = "President";            $sth->bind_param(1, $value);            # execute the INSERT statement            my $rc = $sth->execute            or die "Can‘t execute statement: $DBI::errstr";            # prepare a SQL SELECT statement            my $sth = $dbh->prepare( q{SELECT name, job FROM STAFF})            or die "Can‘t prepare statement: $DBI::errstr";            # execute the SELECT statement            my $rc = $sth->execute            or die "Can‘t execute statement: $DBI::errstr";            # Use Statement Handle Attributes, NUM_OF_FIELDS, NAME.            # NUM_OF_FIELDS  (This attribute is the number of fields (columns) in            # the data the prepared statement will return.)            # Statements that don‘t return rows of data, like DELETE and CREATE            # set the NUM_OF_FIELDS attribute to 0.            # NAME  (This attribute returns a reference to an array of field names            # for each column.)            my $name = "";            my $job = "";            print "Query will return $sth->{NUM_OF_FIELDS} fields.\n\n";            print "Field names: @{ $sth->{NAME} }\n";            # The fetchrow_array utility method fetches the next row of data and            # returns it as a list containing the field values.            while (($name, $job) = $sth->fetchrow_array) {            print "$name | $job\n";            }            # prepare a SQL DROP statement            my $sth = $dbh->prepare( q{            DROP TABLE STAFF;            }) or die "Can‘t prepare statement: $DBI::errstr";            # execute DROP statement            my $rc = $sth->execute            or die "Can‘t execute statement: $DBI::errstr";            # teminate the connection            $dbh->disconnect;            

现在打开一个命令窗口,进入 perl.exe 所在路径,并输入 perl perlExample.pl

如果一切正常,那么应该可以看到如下输出:

C:\perl_test>perl perlExample.pl            Query will return 2 fields.            Field names: NAME JOB            Pearce | Clerk            Hachey | Mgr            Smith | President            

如果该脚本无法正常运行,那么应检查以下几项:

  • Derby Network Server 是否已启动?
  • 是否安装了所有必需的软件?
    • Derby 或 Cloudscape
    • DB2 Universal JDBC 驱动程序(只对 Derby 是必需的)
    • DB2 ODBC 支持
    • Perl
    • Perl DBI 组件
    • Perl DBD-ODBC 驱动程序

 





回页首

结束语

本文向您展示了如何安装和配置 Perl,描述了如何为使用 IBM DB2 ODBC 驱动程序的 ODBC 来编目 Derby 节点,以及如何安装 Perl DBI 和 DBD-ODBC 组件,还演示了如何使用 Perl 执行基本的数据库操作。



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • Learning Perl, 2nd Edition, Chapter 1 (O‘Reilly, 1997) 对 Perl 作了很好的介绍。

  • 在 perl.com, A Short Guide to DBI, Perl‘s Database Inteface Module 可以找到关于 Perl DBI 的很好的介绍性文章。

  • IBM Cloudscape discussion forum 与作者和其他读者共享您对本文的疑问和见解。

  • 为了了解更多关于 IBM Cloudscape 的信息,可以访问 developerWorks Cloudscape 专区。在那里可以找到很多技术性文档、关于 how-to 问题的文章、教学、下载、产品信息等等。


关于作者

 

Moira Casey 是 DB2 领域的咨询工程师。在过去 6 年的时间里,她一直是一名 DB2 方面的测试工程师,最近才转向 Cloudscape。