级别: 初级 Moira Casey (caseymo@us.ibm.com), 质量保证人员, IBM
2004 年 12 月 01 日
在本文中,您可以发现如何使用 Perl、Open Database Connectivity (ODBC) 和 Perl Database Interface (DBI) 来访问 Apache Derby 数据库中的数据。文中将介绍在 Windows® 上安装 Perl、ODBC 驱动程序、Perl DBI 以及 Perl DBD-ODBC 模块的过程,同时还提供了一个示例 Perl 脚本,用以演示如何连接到 Derby 数据库,如何向 Derby 数据库插入数据,以及如何从中选择数据。
概述
要使用 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 Cloudscape 是
Apache 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 脚本。本文包括一个示例脚本,用以演示上述过程。
软件需求
本节中描述的软件可以免费下载。
安装下面列出的
某一种数据库:
-
Cloudscape 10.0
(包括了 IBM DB2 Java Database Connectivity (JDBC) Universal Driver)
-
Apache
Derby 和
IBM DB2
JDBC Universal Driver
另外,安装下面列出的
所有软件:
配置 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 上
ij 的
java 命令,为了便于阅读,这个命令被分成数行:
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 命令失败,则应该检查:
如果
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 执行基本的数据库操作。
参考资料
关于作者  | |  | Moira Casey 是 DB2 领域的咨询工程师。在过去 6 年的时间里,她一直是一名 DB2 方面的测试工程师,最近才转向 Cloudscape。 |
对本文的评价
|