unixODBC编程(一)安装配置ODBC
在类Unix的操作系统环境中访问数据库,如果想要有好的移植性,或者更换数据库而不需要修改代码,最好的方式就是用ODBC访问数据库。ODBC是微软公司在windows环境中访问不同的数据库而定义的统一访问接口,在Unix环境中有一个软件包叫做unixODBC,使用它可以用同样的函数来访问数据库。
在使用unixODBC之前要先安装它,从官网unixODBC下载最新的软件包,例如unixODBC-2.3.12.tar.gz,这是一个源代码压缩文件,需要编译后安装。下面以linux下安装unixODBC为例,安装到/home/oracle目录下,配置oracle的ODBC驱动程序,看一下操作步骤。
以oracle用户登录linux,首先把软件包传到一个临时目录下,比如/tmp目录。
在当前目录下解压,tar xvfz unixODBC-2.3.12.tar.gz。
由于linux系统下默认会安装低版本的unixODBC,为了区别开来,我们把新的unixODBC安装在/home/oracle目录下,然后配置使用新版本的软件包。
进入源程序目录,cd unixODBC-2.3.12
配置软件编译环境,./configure --prefix /home/oracle/unixODBC,这个命令替换默认目录,把软件安装在/home/oracle/unixODBC目录下。
编译源代码,make
安装软件包,make install
执行完上面的命令,在/home/oracle下已经创建了一个目录unixODBC,所有头文件,库文件,配置文件,可执行文件都在里面。下面配置使用新的unixODBC软件。unixODBC软件使用两个环境变量来找到软件的位置和配置文件的位置,一个是ODBCHOME,指定软件安装的位置,一个是ODBCINI指定odbc.ini文件的位置,odbc.ini一般存放在ODBCHOME下的etc目录中。创建一个文件odbc.env,用来存放环境变量,内容如下。
ODBCHOME=/home/oracle/unixODBC
export ODBCHOME
ODBCINI=$ODBCHOME/etc/odbc.ini
export ODBCINI
ORACLE_HOME=/u01/oracle/product/19.3.0/db_1
export ORACLE_HOME
PATH=$ODBCHOME/bin:$PATH
export PATH
LD_LIBRARY_PATH=$ODBCHOME/lib:$ORACLE_HOME/lib
export LD_LIBRARY_PATH
文件中还设置了ORACLE_HOME和LD_LIBRARY_PATH,因为后面要配置oracle的ODBC驱动程序,这是一个动态链接库文件,位置在ORACLE_HOME/lib下。
执行这个环境文件设置环境变量,使用命令 . ./odbc.env
下面就要配置Oracle的驱动程序和应用程序使用的数据源名称了。驱动程序在$ODBCHOME/etc/odbcinst.ini,编辑输入下面的内容。
[ora19c_driver]
Description=ODBC driver for Oracle 19c
Driver=/u01/oracle/product/19.3.0/db_1/lib/libsqora.so.19.1
Setup=/u01/oracle/product/19.3.0/db_1/lib/libsqora.so.19.1
这里主要指定了Oracle ODBC动态库的位置和名称。
配置数据源在$ODBCHOME/etc/odbc.ini文件中,编辑输入下面的内容。
[ora_test]
Description=Oracle ODBC test DSN
Driver=ora19c_driver
ServerName=//192.168.16.131:1521/pdb_dx
这个文件主要定义了数据源名称(DSN)和连接数据库的信息还有使用的驱动程序。在这里数据源名称是ora_test,驱动程序是在odbcinst.ini中配置的ora19c_driver,连接数据库的信息是//192.168.16.131:1521/pdb_dx,也可以是一个tnsname,替换成自己的主机IP,端口和服务名。
用isql测试一下数据源是否能用。命令为isql -v ora_test scott tiger
其中-v表示打印详细信息,ora_test是数据源的名称,scott是数据库用户名,tiger是用户密码。
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| echo [string] |
| quit |
| |
+---------------------------------------+
如果出现上面的信息,表示数据源配置成功,否则会显示出错信息。
说一下我在配置的过程中遇到的问题,还是有些不顺利的地方。
第一次配置完后,用isql测试,出现下面的错误。
isql: symbol lookup error: /oracle11/product/11.2/lib/libsqora.so.11.1: undefined symbol: SQLGetPrivateProfileStringW
用nm libsqora.so.11.1 | grep "SQLGetPrivate"查看连接库中的函数,确定存在上面的函数,但是在动态连接时找不到函数。网上查了半天,有人说是unixODBC的版本问题,继续查找,在2.2.11版本之前确实没有解决这个问题,但是现在用的是2.3.12版本,肯定已经解决这个问题了,所以不是unixODBC的版本问题,后来又查到在redhat(centOS)5.x版本中都存在这个问题,是由于这些linux版本不是Oracle的认证版本,存在bug,所以出现问题。
第二次配置,换一个linux版本,使用了centOS7,重复上面的配置步骤,最后使用isql测试。
仍然出现错误,libsqora.so.11.1文件打不开,奇怪了,使用命令ldd看看哪些依赖文件没有。
ldd /oracle11/product/11.2/lib/libsqora.so.11.1
发现libodbcinst.so.1 => not found
这个文件应该在$ODBCHOME/lib下,查看一下发现只有libodbcinst.so.2文件,没有libodbcinst.so.1,把libodbcinst.so.2拷贝成libodbcinst.so.1,然后执行isql测试,这次通过了。
第三次配置,换了Oracle版本,使用Oracle 19c,这次顺利通过。