欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

perl通过unixODBC连接SQLServer

程序员文章站 2022-05-06 14:40:55
...

本文讲述三个内容: 一:说明 二:环境配置 三:操作脚本内容 一:说明 MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以 通过 ODBC 连接 Windows系统的SQLServer数据库; WindowsServer 2003用户注意: 在Windows Se

本文讲述三个内容:

一:说明

二:环境配置

三:操作脚本内容




一:说明

MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以通过ODBC连接Windows系统的SQLServer数据库;
WindowsServer 2003用户注意:
在Windows Server 2003系统上安装的SQLServer是不会打开1433端口的,所以请Windows2003用户在安装完SQLServer之后一定装上SQLServer SP3布丁


二:安装相关驱动及环境配置

如果没安装DBI最好先安装DBI 不然后面会报错

DBI安装:DBI详细信息参考:http://dbi.perl.org/
1.下载DBI包:
下载地址:http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.620.tar.gz


tar xzf DBI-1.620.tar.gz
进入解压包内 perl Makefile.PL 
make test
make
make install (如果不是root用户,要sudo一下)


1.下载相关软件 unixODBC、freetds和DBD-ODBC


首先需要下载3个文件:
Linux系统的ODBC
unixODBC-2.2.8.tar.gz ( http://www.unixodbc.org)

连接SQLServer或Sybase的驱动
freetds-0.62.4.tar.gz ( http://www.freetds.org)

perl的ODBC模块
DBD-ODBC-1.12.tar.gz ( http://cpan.perl.org)
把下载到的三个文件放到同一个目录


2.安装unixODBC

# tar vxzf unixODBC-2.2.8.tar.gz
# cd unixODBC-2.2.8
# ./configure --prefix=/usr/local/unixODBC --enable-gui=no
# make
# make install

3.安装freetds
# tar vxzf freetds-0.62.4.tar.gz
# cd freetds-0.62.4
# ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC --with-tdsver=8.0
# make
# make install



4.安装DBD-ODBC
在安装之前要先设置一下环境变量
# export ODBCHOME=/usr/local/unixODBC

之后开始编译安装
# tar vxzf DBD-ODBC-1.12.tar.gz
# cd DBD-ODBC-1.12
# perl Makefile.PL
# make
# make install
所有的软件到现在都安装完成了,接下来就是配置了


5.配置freetds
# cd /usr/local/freetds
# vi etc/freetds.conf
修改以下的一段,并把;去掉
改好之后的内容:
[MyServer2k] #不同驱动的此处名字不同 注意 下面测试时注意对应
host=192.168.0.32
port=1433
tds version=8.0

其中的[MyServer2k]代表在客户端使用的服务器名称,host代表SQLServer服务器的IP地址,port代表端口,测试连接

其配置项解释如下:
tds version: 指明tds协议的版本,连接数据库时使用,如果在环境变量中没有设置
此项,则由此配置决定,协议版本可取4.2,5.0,7.0,8.0。


host: 数据库服务器的主机名或者ip地址。


port: 数据库服务器的监听端口,可以取任何有效的端口值,一般而言Sybase SQL10以前为1433,10以上用5000,而Sybase SQLAnywhere 7是2638,Microsoft SQL server则用1433。此配置可以被环境变量中的TDSPORT改写。

initial block size: 此值只能取512的倍数,默认为512,指定了协议块的最大值,
一般不要改变此默认 配置。


dump file: 任何有效的文件名,指明了转储文件的路径并且会打开日志记录。


dump file append: yes或者no,决定是否追加保存到dump file文件中。


timeout:设置处理的最大等待时间。


connect timeout: 设置连接的最大等待时间。


emulate little endian: yes或者no,是否强制大端机使用小端方式与MS Server通信。


client charset: 任何有效的iconv字符集。默认值为ISO-8859-1,使FreeTDS使用iconv在数据库服务器和用户程序之间转换。

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

注意, client charset 必需大于或等于服务端数据库使用的字符集.

例如,服务端数据库是 MS SQL Server 2000, 字符集是 GB2312.
那么 client charset 可以设置为 GB2312(等于), GB18030(大于),UTF-8(大于)但不能设为ISO-8859-1(小于), Shift_JIS(不等于).
由于 UTF-8 是所由字符集的超集,因此设置为 UTF-8 总是可行的.
此外, FreeTDS的client charset不能设置为 UTF16. 这时目前该软件设计的局限,其官方网站称,在未来版本中可能会增加对client charset UTF16的支持.

# bin/tsql -S MyServer2k -H 192.168.0.32 -p 1433 -U sa -P password
1> use gameDB
2> go
1> select count(*) from t_ip
2> go
4
1> quit
一切都很顺利
现 在来说明以下这些参数的作用,-S MyServer2k是在freetds.conf中定义好的,-H 192.168.0.32服务器IP地址,和freetds.conf中的一致,如果使用了-S参数,这个参数可以不用,-p 1433用来指定端口是1433 ,-U sa用来指定连接数据库的用户名,-P password用来指定连接数据库的密码。


6.配置unixODBC
# cd /usr/local/unixODBC

向ODBC添加SQLServer驱动
# vi etc/odbcinst.ini

写入如下内容:
[TDS] ;驱动名称
Description = MS-SQLServer ;描述
Driver = /usr/local/freetds/lib/libtdsodbc.so ;驱动程序
Setup = /usr/local/freetds/lib/libtds.so ;不要问我,我也不知道这是什么
FileUsage = 1


或者

[FreeTDS]
Driver = /usr/local/freetds/lib/libtdsodbc.so
;Threading = 1


保存退出

添加DSN


# cd /usr/local/unixODBC

# vi etc/odbc.ini


写入如下内容
[123] ;DSN名称
Driver = TDS ;ODBC驱动 与上面odbcinst.ini中的驱动名称对应
Server = 192.168.0.32 ;sqlserver服务器IP 或者 Servername = MyServer2k ;在 freetds.conf中定义
Database = gameDB ;要使用的数据库
Port = 1433 ;端口
Socket =
Option =

Stmt =

或者



[zzq_cq]
Driver = FreeTDS
Server = 192.168.0.89
Port = 1433
TDS_Version = 7.2
Database=db
User=sa
Password=123
client charset=utf-8




保存并退出,测试ODBC的连接
# bin/isql -v 123 sa password
SQL> select count(*) from t_ip
+----------+
| |
+----------+
| 4 |
+----------+
SQL> quit
OK,测试通过,开始测试perl能否正确使用ODBC
在使用perl连接ODBC之前要做些准备工作
把ODBC的共享库都复制到/usr/lib目录


# cp /usr/local/unixODBC/lib/libodbc.* /usr/lib



操作脚本时 如果报错:

install_driver(ODBC) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/ODBC/ODBC.so' for module DBD::ODBC: libodbc.so.2: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.
at (eval 5) line 3
Compilation failed in require at (eval 5) line 3.
Perhaps a required shared library or dll isn't installed where expected
at createalltable.pl line 27



则运行如下:

# find / -name "libodbc.so"
/usr/local/unixODBC/lib/libodbc.so

# echo "/usr/local/unixODBC/lib/" >> /etc/ld.so.conf

# ldconfig





三:操作脚本内容

# vi test.pl

内容如下
#!/usr/bin/perl
use DBI;
$dbh=DBI->connect('dbi:ODBC:123','sa','password'); //这里的123于上面odbc.ini中定义的DSN名称对应
my $sth=$dbh->prepare("select * from t_ip"); //要执行的sql语句
$sth->execute();
while (@data=$sth->fetchrow_array()){ //把得到的内容放到data列表中
print "$data[0] $data[1] $data[2]\n";

}


资源释放语句,关闭语句(与mysql有点区别mysql可以直接disconnect):

$sth->finish;

$dbh->disconnect;


只单独disconnect会报错:

DBI::db=HASH(0x812938)->disconnect invalidates 1 active statement handle
(either destroy statement handles or call finish on them before disconnecting)


注意是 $sh对应位置的 变量 finish 而不是 $dbh

否则会报错:

Can't locate object method "finish" via package "DBI::db"



保存退出
# perl test.pl 


PS: 如果 你拿到一台机子 不知道 它的驱动 可以进入/usr/local/unixODBC/etc中查看配置文件 odbcinst.ini 和odbc.ini


参考资料:

http://space.itpub.net/82392/viewspace-238018

http://opsyun.blog.51cto.com/1037036/713910


PS:!!!!!注意 在linux中用perl提取sqlserver的数据时,linux系统的编码要跟sqlserver数据库的编码相同 不然 提取出的数据会是乱码。 比如 sqlserver中的数据是gbk 则运行perl的linux系统也必须设为 gbk的环境 用 export LANG=zh_CN.GBK 详见:mysql乱码问题完美解决篇(我用的perl其他语言类推可解)