首页 > 数据库 > PostgreSQL > 正文

PostgreSQL7.0手册-接口-57. ODBC 接口

2019-09-08 23:34:10
字体:
来源:转载
供稿:网友
第五十七章. ODBC 接口
内容 
背景 
Windows 应用 
Unix 安装 
配置文件 
ApplixWare 
注意:背景信息最初作者是 Tim Goeke
ODBC (开放数据库联接 Open Database Connectivity)是一套 API,用这套 API 允许你书写可以应用在各种 RDBMS 服务器上互操作的应用.ODBC 提供一个与产品无关的在前端应用和后端数据库服务器之间的接口,允许用户可以书写可以运行于来自不同厂商的数据库服务器上的应用. 
背景
ODBCAPI把后端匹配为一个 ODBC-兼容的数据源.这些(数据源)可以是从文本文件到 Oracle 或 PostgresRDBMS 的任何东西. 
后端的访问来自 ODBC 驱动,或者厂商提供的允许数据访问的驱动.psqlODBC 就是这种驱动,同时还有其他驱动可以得到,例如 OpenLink ODBC 驱动. 

一旦你写了一个 ODBC 应用,你 应该 能够与 任何 后端数据库联接,不管数据库厂商是谁,只要数据库结构是一致的. 

例如.你可以拥有 MS SQL Server 和 Postgres 服务器,它们拥有完全一样的数据.使用 ODBC,你的 Windows 应用将做完全一样的调用并且后端数据源将(对 Windows 应用而言)看起来一样. 
 


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

Windows 应用
在现实世界里,驱动的差异和 ODBC 支持的级别降低了 ODBC 的潜能: 
Access,Delphi和 Visual Basic 都直接支持 ODBC.
在 C++ 里,象 Visual C++,你可以使用 C++ ODBCAPI.
在 Visual C++ 里,你可以使用 CRecordSet 类,它把 ODBCAPI 集封装在 MFC 4.2 类里面.这是在 Windows NT 里开发 Windows C++ 应用的最简单的途径.

书写应用
“如果我写了一个基于 Postgres 的应用,我能否写成用 ODBC 对 Postgres 服务器调用的形式,或者是有其他的数据库程序象 MS SQL Server 或 Access 需要访问数据时怎么办?” 
ODBCAPI 就是解决方法.对于 Visual C++ 编码,你可以在 Microsoft 的站点或者你的 VC++ 文挡里面找到更多信息. 

Visual Basic 和其他 RAD 工具拥有使用 ODBC 直接访问数据的 Recordset 对象.使用数据敏感的( data-aware )控制,你可以迅速与 ODBC 后端数据库建立联接(非常 迅速). 

用 MS Access 进行试验将帮助你把这些东西弄明白.试着用用 File->Get External Data (文件->获取外部数据).

小技巧:你必须先设置一个 DSN.

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

Unix 安装
ApplixWare 有一个 ODBC 数据库接口至少能够支持一些平台.ApplixWare v4.4.2 已经在 Linux 下证明可以与使用包含在 Postgres 里的psqlODBC 驱动的 Postgres v7.0 共同使用. 
制作驱动
谈到 psqlODBC 驱动程序(或任何ODBC 驱动程序)的第一件事情就是在使用 ODBC 驱动程序的系统里必须存在一个驱动程序管理器.有一个叫 iodbc 的用于 Unix 的自由软件 ODBC 驱动程序,我们可以在网上的许多地方获得这个东西,包括 AS200。(译注:好象要换个地方 www.iodbc.org ).安装 iodbc 的指导超出本文挡的范围,但可以在压缩的iodbc .shar 文件里面找到一个 README ,说明了如何安装和运行. 
我们已经说过,你找到的任何用于你的平台的驱动管理器应该支持psqlODBC 驱动或者任何 ODBC 驱动. 

用于 psqlODBC 的 Unix 配置文件最近已经大大修改了,以便于很容易地在支持的平台上制作(驱动)同时也便于今后对其他 Unix 平台的支持.该驱动的新的配置和制作文件应该已经把在支持的平台上制作驱动变为一个简单的过程.目前这些(平台)包括 Linux 和FreeBSD,但我们希望其他用户可以奉献出必要的信息以便迅速扩展这个驱动可以制作的平台的数量. 

实际上只有两个独立的制作驱动的方法 --取决于你是如何获得驱动的,这些区别最终只是体现在你在那里和如何运行 configure 和make.驱动程序可以当作一种独立的,只有客户端的安装,或者可以作为主 Postgres 发布的一部分.如果你的 ODBC 客户端应用运行在多种异种平台上,独立安装的方式比较方便.当目标客户端和服务器一样或者客户端和服务器有着相似的配置时,集成的安装模式比较方便. 

详细说来,如果你把 psqlODBC 驱动做为 Postgres 版本的一部分制作(从现在开始我们把这个当作一次 "集成" 制作)那么你将在 Postgres 版本的顶级目录和 Postgres 其他的库文件一起配置和安装 ODBC 驱动程序.如果你的驱动是一个独立的包,那么你将在你解开驱动源程序的位置配置和制作驱动. 
  

集成安装 
这个安装过程适用于一次集成安装. 

为 src/configure 声明 --with-odbc 命令行参数: 
% ./configure --with-odbc
% make
重新制作 Postgres 版本: 
% make install
安装放在 PGROOT/contrib/odbc/odbc.sql 里面的 ODBC 目录扩展: 
% psql -e template1 < $PGROOT/contrib/odbc/odbc.sql
这里声明 template1 作为目标数据库将保证所有后继的数据库都有这些相同的定义.
一旦配置完,ODBC 驱动将在为 Postgres 系统其他部件定义的区域里制作和安装.安装范围的 ODBC 配置文件将被放置在 Postgres 目标树(POSTGRESDIR)的顶层目录.你可以用 make 命令行替换这个位置 
% make ODBCINST=filename install
v6.4前的集成安装 
如果你安装有早于 v6.4 的 Postgres,而且你拥有最初的源代码树,并且你想使用最新的版本的 ODBC 驱动,那么你可能会希望下面这样的安装. 

拷贝输出的 tar 文件到你的目标系统,并且在一个干净的目录里解开包. 
在包含源代码的目录里面,键入: 

% ./configure
% make
% make POSTGRESDIR=PostgresTopDir install
如果你想把安装组件放到不同的目录树中,那么你可以显式地声明各种不同的目的地: 
% make BINDIR=bindir  LIBDIR=libdir  HEADERDIR=headerdir ODBCINST=instfile install
独立的安装 
一次独立的安装不是集成在一个正常的 Postgres 版本的制作过程中的.这种方法很适合为有多种不同平台的有本地安装的 Postgres 源代码树的客户端上制作 ODBC 驱动. 

独立安装的库和头文件的缺省路径分别是 /usr/local/lib 和 /usr/local/include/iodbc。另外还安装一个系统范围的配置文件到 /share/odbcinst.ini (如果 /share 存在)或 /etc/odbcinst.ini (如果 /share 不存在). 

注意:把文件安装到 /share 或者 /etc 需要 root 权限.Postgres 的大多数安装步骤不需要这个条件,而且你可以选另一个 Postgres 超级用户可写的目标路径替换之.
独立安装的版本可以在 Postgres 发布版本里面制作或者可以从 Insight Distributors,目前的非 Unix 源码维护者获取源代码. 
把压缩的 tar 文件拷贝到一个空目录.如果用的是 zip 包,用下面命令解包 

% unzip -a packagename
-a 选项可以去掉 DOS 源文件里的 CR/LF 对. 
如果你拿到的是 gzipped tar 包,那么运行 

% tar -xzf packagename
从主 Postgres 源文件树里创建一个完整的独立安装 tar 文件:
配置主 Postgres 版本. 
创建 tar 文件: 

% cd interfaces/odbc
% make standalone
拷贝输出的 tar 文件到你的目标系统.如果使用 ftp,应该使用二进制模式传输. 
把 tar 文件解开到一个干净的目录. 

配置独立安装: 

% ./configure
配置可以带有选项进行: 
% ./configure --prefix=rootdir --with-odbc=inidir
这里 --prefix 把库和头文件安装到目录 rootdir/lib 和 rootdir/include/iodbc 下,并且 --with-odbc 把 odbcinst.ini 安装到指定的目录. 
注意这些选项同样可以用于集成安装,但是要注意用于集成安装时--prefix 将同样应用于你的 Postgres 安装的其他部分.--with-odbc 只适用于配置文件 odbcinst.ini。 

编译并链接源代码: 

% make ODBCINST=instdir
你同样可以在 'make' 命令行上覆盖缺省安装路径.这些只适用于库和头文件的安装路径.因为驱动需要知道 odbcinst.ini 文件的位置,试图覆盖声明该文件的安装路径将可能让你很头疼.最安全的方法是简单的允许驱动把 odbcinst.ini 文件装到缺省路径或者你在 './configure' 命令行用 --with-odbc 声明的路径. 
安装源代码: 

% make POSTGRESDIR=targettree install
要分别覆盖库和头文件的安装路径,你需要在 make install 命令行上传递正确的安装变量.这些变量是 LIBDIR,HEADERDIR 和 ODBCINST.在 make 命令行上覆盖 POSTGRESDIR 将导致 LIBDIR 和 HEADERDIR 放在你声明的新目录里的顶层.ODBCINST 独立于 POSTGRESDIR。 
下面是你如何显式地声明目标变量的例子: 

% make BINDIR=bindir LIBDIR=libdir HEADERDIR=headerdir install
例如,键入 
% make POSTGRESDIR=/opt/psqlodbc install
(在你运行过 ./configure 和 make 后)将导致库和头文件被分别安装到目录 /opt/psqlodbc/lib 和/opt/psqlodbc/include/iodbc . 
命令 

% make POSTGRESDIR=/opt/psqlodbc HEADERDIR=/usr/local install
应该导致库被安装到 /opt/psqlodbc/lib 而头文件安装到 /usr/local/include/iodbc.如果这些不起作用,请与某位维护者联系。

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

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

配置文件
~/.odbc.ini 包含用户为 psqlODBC 声明的访问信息.这个文件用了 Windows 注册表文件的习惯,但是忽略这些限制也可以. 
.odbc.ini 文件有三个必须的段.第一个是 [ODBC Data Sources],定义了一个你希望访问的每个数据库的任意名称和描述.第二个必须的段是 Data Source Specification (数据源声明)并且每个数据库都将有一个这样的段.每个段必须用 [ODBC Data Sources] 里给出的名称标记并且必须包含下面的内容: 

Driver = POSTGRESDIR/lib/libpsqlodbc.so
Database=DatabaseName
Servername=localhost
Port=5432
小技巧:记住 Postgres 数据库名通常是单独一个词,没有任何类型的路径名称.Postgres 服务器管理对数据库的实际访问,并且你只需要在客户端声明(数据库)名称.
可以增加其他条目用于控制显示的格式.第三个必须的段是 [ODBC],必须包含 InstallDir 关键字和一些其他选项. 
这里是一个 .odbc.ini 文件的例子,显示了三个数据库的访问信息: 

[ODBC Data Sources]
DataEntry = Read/Write Database
QueryOnly = Read-only Database
Test = Debugging Database
Default = Postgres Stripped

[DataEntry]
ReadOnly = 0
Servername = localhost
Database = Sales

[QueryOnly]
ReadOnly = 1
Servername = localhost
Database = Sales

[Test]
Debug = 1
CommLog = 1
ReadOnly = 0
Servername = localhost
Username = tgl
Password = "no$way"
Port = 5432
Database = test

[Default]
Servername = localhost
Database = tgl
Driver = /opt/postgres/current/lib/libpsqlodbc.so

[ODBC]
InstallDir = /opt/applix/axdata/axshlib

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

ApplixWare
配置
必须正确配置 ApplixWare ,以便让它能够访问 PostgresODBC 驱动软件. 
  
允许 ApplixWare 数据库访问 
这些指导信息适用于 Linux 上的 4.4.2 版本的 ApplixWare.请参考 Linux 系统管理 在线手册获取更详细的信息. 

你必须修改 axnet.cnf 以便于 elfodbc 可以找到 libodbc.so (ODBC 驱动管理器)共享库.这个库包含在 ApplixWare 发布版本里,但是要修改 axnet.cnf 指向正确的位置. 
以 root 身份编辑文件  applixroot/applix/axdata/axnet.cnf. 

在 axnet.cnf 的底部,找出以下面文字开头的一行 
#libFor elfodbc /ax/...
把这一行改成 
libFor elfodbc applixroot/applix/axdata/axshlib/lib
告诉 elfodbc 在这个路径里查找 ODBC 支持库.通常 Applix 被装在 /opt,这样完整的路径就是 /opt/applix/axdata/axshlib/lib,但如果你在其他地方安装了 Applix ,相应的修改路径.
创建上面描述的 .odbc.ini.你可能还要增加标志 
TextAsLongVarchar=0
到 .odbc.ini 的数据库声明部分,这样文本字段就不会显示为 **BLOB**。
测试 ApplixWare ODBC 联接 
运行 Applix Data 
选择感兴趣的 Postgres 数据库. 

选择 Query->Choose Server. 
选择 ODBC,并且敲击 Browse.你在 .odbc.ini 里配置的数据库应该显示出来.确保  Host: field  是空的(如果不是,axnet 将试图与另一台机器的 axnet 联接查找数据库).S 

选择敲击 Browse 显示出的数据库,然后敲击 OK. 

在登录标识对话框里输入 username(用户名)和 password (口令).然后敲击 OK.

你应该看到在数据窗口左下脚有 “Starting elfodbc server” (启动 elfodbc 服务器)字样.如果弹出一个错误对话框,参考下面的调试章节. 
'Ready'(就绪)信息将在数据窗口的左下角出现.这表明你现在可以输入查询. 

从 Query->Choose tables 选择一个表,然后选择 Query->Query 来访问该数据库.表的头 50 行左右的信息将显示出来.

常见问题
在尝试通过 Applix Data 建立一个 ODBC 联接时下面的信息可能出现: 
Cannot launch gateway on server(无法在服务器上建立网关) 
elfodbc can't find libodbc.so. Check your axnet.cnf.(elfodbc 无法找到 libodbc.so.检查你的 axnet.cnf.) 
Error from ODBC Gateway: IM003::[iODBC][Driver Manager]Specified driver could not be loaded 
libodbc.so 不能在找到 .odbc.ini 里列出的驱动.检查设置. 
Server: Broken Pipe 
驱动进程因为其他原因结束的.你可能拿的不是最新的 Postgres ODBC 软件包. 
  
setuid to 256: failed to launch gateway 
九月发布的 ApplixWare v4.4.1(第一个有 Linux 下官方支持的 ODBC)在用户名超过八(8)字符长时有问题.这个问题是 Steve Campbell 发现的. 
作者:由 Steve Campbell 在 1998-10-20 提交.
axnet 程序的安全系统看起来有一点奇怪.axnet 代理用户的事务,因而在一个真正的多用户系统它应该以 root 权限(这样它可以读/写每个用户的目录).我对建议这样做有些犹豫,因为我们不知道这样会引起什么样的安全漏洞.
调试 ApplixWare ODBC 联接
一个调试联接问题的很好的 Unix 系统工具是 strace. 
用 strace 调试 
启动 applixware. 
在 axnet 进程上运行一个 strace.例如,如果 

% ps -aucx | grep ax
显示 
cary   10432  0.0  2.6  1740   392  ?  S  Oct  9  0:00 axnet
cary   27883  0.9 31.0 12692  4596  ?  S   10:24  0:04 axmain
那么运行 
% strace -f -s 1024 -p 10432
检查 strace 输出. 
来自 Cary :许多从 ApplixWare 来的错误信息输出到 stderr,但是我不能确定 stderr 发送到哪里,所以 strace 是把它们找出来的方法.
例如,在得到一个 “Cannot launch gateway on server”,我在 axnet 上运行 strace 并且得到 
[pid 27947] open("/usr/lib/libodbc.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
[pid 27947] open("/lib/libodbc.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
[pid 27947] write(2, "/usr2/applix/axdata/elfodbc:
can't load library 'libodbc.so'/n", 61) = -1 EIO (I/O error)
所以发生的错误是 applix elfodbc 在查找 libodbc.so,但是找不到.这就是为什么 axnet.cnf 需要修改的原因.
运行 the ApplixWare 演示
为了通过 ApplixWare 数据教程,你需要创建教程提到的样例表.所用的创建表的 ELF 宏试图在许多数据库字段上使用一个 NULL 条件,而目前 Postgres 不允许这些选项. 
  
要绕开这些问题,你可以按下面方法做: 
修改 ApplixWare 演示 
拷贝 /opt/applix/axdata/eng/Demos/sqldemo.am 到一个本地目录. 
编辑本地 sqldemo.am 的拷贝: 

查找 'null_clause = "NULL" 
修改这些成为 null_clause = ""

运行 Applix Macro Editor. 
从 Macro Editor 里打开 sqldemo.am 文件. 

选择 File->Compile and Save. 

退出 Macro Editor. 

运行 Applix Data. 

选择 *->Run Macro 

输入值 “sqldemo”,然后敲击 OK. 

你应该看到数据窗口状态栏的的进度(在左下角). 

你现在应该可以访问 demo 表.

有用的宏
你可以向你的标准 Applix 启动宏文件里增加关于你的数据库登录和口令的信息.这是一个例子文件 ~/axhome/macros/login.am: 
macro login
set_set_system_var@("sql_username@","tgl")
set_system_var@("sql_passwd@","no$way")
endmacro
  注意 
对任何含有用户名和口令信息的文件你都要仔细保护. 

支持的平台
psqlODBC 已经在 Linux 制作和测试过了.也有在 FreeBSD 和 Solaris 上成功的报告.在代码里没有限制它在已经支持 Postgres 的平台上运行的东西。(译注:这里大部分内容是ApplixWare的特点,那位朋友有经验,能否详细介绍一下?)

--------------------------------------------------------------------------------
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选