Sybase 简介,第 2 部分

作者:Jay Sissom

上个月,我们安装了一个 Sybase 数据库服务器。本月,我们将安装一个客户端来访问我们的服务器。首先,我们需要了解 Sybase 网络接口的工作原理。

当 Sybase 客户端需要访问数据库中的资源时,它必须创建到数据库服务器的网络连接(参见图 1)。Sybase 创建了一个协议用于通过网络进行通信。这个协议被称为表格数据流 (TDS) 协议。它运行在其他网络协议之上,例如 UNIX 系统上的 TCP/IP 或 Novell 网络上的 IPX/SPX。TDS 是一种专有协议,Sybase 没有对其进行文档化。幸运的是,Sybase 创建了客户端库,可以用来与服务器通信。一群人试图对 TDS 协议进行逆向工程。请查看 http://sunsite.unc.edu/freetds/ 以获取更多信息。

Introduction to Sybase, Part 2

图 1. TDS 协议

Sybase 支持数据库的两个接口。DB-Library 是一个 API,在 Sybase 产品中已经使用了相当长一段时间。我相信它被支持是为了向后兼容性,并且可能在产品的未来版本中不再支持。CT-Library 是 Sybase 为版本 10 及更高版本的产品创建的 API。它支持高级功能,例如游标和异步查询处理。您不需要理解这些功能即可对数据库服务器进行基本处理。我们将使用 CT-Library 与我们的服务器通信。

我们可以使用 C 或 C++ 编写我们的客户端。执行此操作所需的库包含在服务器中。在服务器目录下的 sample 目录中查找示例。有一个用于 DB-Library 的子目录和一个用于 CT-Library 的子目录。但是,我们不必使用 C 或 C++。Perl 语言的一个扩展 sybperl 使能够使用 Perl 编写客户端来访问数据库。

大多数 Linux 发行版都带有 Perl 语言。在我的系统上,我安装了 Red Hat 5.1,默认情况下包含 Perl 版本 5。幸运的是,无需重新编译 Perl 即可安装 sybperl。使用这种方法排除了使用 DB-Library 的可能性,这就是我们选择使用 CT-Library 的原因。

如果您的系统上未安装 Perl,请立即安装。如果您的发行版未提供 perl,您可以从 CPAN 下载源代码 (http://www.cpan.org/)。

安装 sybperl

首先,我们必须从 https://perldotcom.perl5.cn/CPAN-local/authors/Michael_Peppler/ 下载 sybperl

撰写本文时可用的最新版本是文件 sybperl-2.09_05.tar.gz (148KB) 中的 2.09_05 版本。将目录更改为 sybperl tar 文件的位置,然后发出命令

perl Makefile.PL

更改为刚刚创建的 sybperl 目录,并编辑 CONFIG 文件。在行 DBLIBVS=1000 中,将 1000 更改为 0。确保行 SYBASE=/opt/sybase 包含 Sybase 服务器的正确目录。行 EXTRA_LIBS=-ltli 必须更改为 EXTRA_LIBS=-linsck

我们将构建 sybperl 以与 CT-library 一起使用。大多数 Linux 发行版都带有 Berkeley DB 库。如果 Perl 配置为使用此库,则同时使用 DB-library 时会发生冲突,因为两者都使用调用 open_database。如果您重新编译 Perl 以排除 Berkeley DB 库,则可以保留 CONFIG 文件中的行 DBLIBVS=1000 并使用 DB-library。

保存对 CONFIG 文件的更改,然后发出此命令

perl Makefile.PL

这将创建一个将构建软件的文件。它会在您的路径中查找 Perl 安装。如果 Perl 不在您的路径中,您需要更改您的路径以包含它。现在发出 make 命令来构建软件;这将需要几分钟才能运行。sybperl 具有可以运行的测试,以确保它构建正确。要运行这些测试,请编辑 PWD 文件以将您的 sa 密码和您的 Sybase 服务器名称放在适当的行上。如果您按照上一期中的说明安装了服务器,则服务器的名称为 linux_dev。保存文件,然后键入命令

make test
此命令将运行一系列测试。如果一切正常,将打印消息“所有测试成功”。

现在,让我们安装 sybperl。如果您的 Perl 安装位于需要 root 访问权限才能修改的目录中,请使用 su 更改为 root。运行命令

make install

Perl 和 sybperl 现在已安装,因此现在是编写一些程序的时候了。

编写 sybperl 程序

此处的所有程序均可供下载。如果您键入这些程序,请务必使用 chmod 使它们可执行。

清单 1。

编写 sybperl 程序非常简单。清单 1 是我们的第一个示例程序。这将列出服务器中所有数据库的名称。以下是对程序逐行解释。

第 1 行告诉 Linux 使用哪个程序来运行此脚本。这必须是您刚刚安装的新版本 Perl。确保您更改此行以指向系统上正确的 Perl 版本。

第 3 行告诉 Perl 使用 CT-library 接口连接到 Sybase。它应该位于您编写的所有访问 Sybase 服务器的 Perl 脚本的开头。

第 5 行连接到正确的 Sybase 服务器。第一个参数是用户名,第二个参数是密码,第三个参数是服务器名称。

第 7 行是要运行的 SQL。

第 9-10 行是在服务器上运行查询并返回对行数组 @rows 的引用的命令。请注意,此命令将整个结果集加载到内存中。这对于小型结果集来说很好,但是如果您期望获得大型结果集,则不应使用 ct_sql。稍后,我将为您提供一种执行命令和接收大型结果集的替代方法。

第 12-14 行将打印返回的所有行。

清单 2

清单 2 是 sybperl 程序更新数据的示例。在第 7 行中,我们使用相同的 ct_sql 命令将 SQL 发送到数据库,但这次未返回一组行。insertdeleteupdate SQL 命令也不会返回行。SQL 命令 use pubs2 告诉 Sybase 使 pubs2 数据库成为此会话其余部分的默认数据库。在第 10 行中,我们再次使用 ct_sql 命令来运行 SQL。这次,我们向 discounts 表添加了一行。您可以使用 isql 程序运行 SQL SELECT 命令以验证是否已添加该行。

编写 Perl CGI 客户端程序

Linux 主要用作 Web 服务器,而 Perl 主要用于编写 Web 应用程序。因此,我们将创建一个 Perl 程序来访问 Sybase 数据库。

清单 3

编写 CGI 程序来访问 Sybase 非常简单。清单 3 是 CGI 程序的完整代码,用于让您知道谁登录了您的 Sybase 服务器。将此程序放在您的 Web 服务器的 cgi-bin 目录中。在默认的 Red Hat 系统上,该目录是 /home/httpd/cgi-bin/。对于此示例,将程序命名为 listing3.pl。

在第 5 行和第 6 行中,我们设置了两个环境变量。Sybase DB-Library 和 CT-Library 必须找到这些环境变量,否则将发生错误。当您运行 CGI 程序时,只有很少的环境变量传递给您的程序。这两个环境变量必须在每个需要访问 Sybase 的 CGI 程序中设置。如果您有许多 CGI 程序,请将这些命令放在包含在所有 CGI 程序中的文件中。

SYBASE 环境变量包含 Sybase 软件的目录。DSQUERY 变量包含默认服务器的名称。

此示例与其他示例之间唯一的其他区别是它将 HTML 输出到浏览器。

其他注意事项

这些示例程序显示了访问 Sybase 数据库服务器的基础知识。在生产程序中,您的程序中必须注意更多事项。

必须正确处理来自服务器的错误。如果您忽略它们,您的程序将在遇到服务器错误时停止。

在我们所有的示例程序中,ct_sql 都用于运行查询。它适用于不返回结果集的 SQL 命令和存储过程,但对于返回大型结果集的查询会存在严重问题。

清单 4

清单 4 显示了如何处理错误并演示 ct_sql 命令的替代方法。在第 3 行和第 4 行中,我们建立了一个客户端和一个服务器消息回调例程。当服务器或客户端生成信息性或错误消息时,将调用这些例程。

在第 7-20 行中,我们处理单个 SQL 语句。Sybase 允许单个语句返回多个结果集。第 8-10 行将处理每个结果集。第 17-19 行将处理结果集中的每一行。第 11-16 行将查看结果集并打印每列的名称和类型。Sybase 结果集包含的不仅仅是数据,它还包括列定义信息。

第 23-50 行是两个回调例程。每次服务器或客户端发出消息时都会调用这些例程。客户端消息的一个示例是如果您无法登录到服务器时返回的消息。服务器消息的一个示例是如果您在 SQL 中有错误时返回的消息。

所有这些信息都可以在 sybperl 和 Sybase 文档中找到。

结论

Sybase 数据库服务器是一个功能强大的软件。不幸的是,所有这些功能都是有代价的。设置和支持 Sybase 服务器不如使用 Postgres 或 MySQL 那么容易,但如果您需要重型、高性能的数据库,Sybase 是您的最佳选择。

下个月,我们将讨论在 Linux 上使用 Sybase 进行应用程序开发。本文将出现在“Strictly On-line”部分。

Jay Sissom 负责印第安纳大学基于 Web 的财务决策支持数据的前端。他已经在许多操作系统上安装和支持了 Sybase 数据库,并使用 C、C++ 和 sybperl 为 Web 编写了数据库客户端,并使用 Visual Basic 和 PowerBuilder 等工具为 Windows 编写了数据库客户端。当他不编程时,他喜欢业余无线电和演奏贝斯吉他和键盘。如果您有任何问题,可以通过电子邮件 jsissom@indiana.edu 与他联系。

加载 Disqus 评论