perl通过unixODBC连接SQLServer

本文讲述三个内容:

一:说明

二:环境配置

三:操作脚本内容




一:说明

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其他语言类推可解)


你可能感兴趣的:(perl,sqlserver,odbc,dbi,操作数据库)