perl通过unixODBC连接SQLServer
本文讲述三个内容: 一:说明 二:环境配置 三:操作脚本内容 一:说明 MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以通过ODBC连接Windows系统的SQLServer数据库; 二:安装相关驱动及环境配置 如果没安装DBI最好先安装DBI ?不然后面会报错 ??
DBI安装:DBI详细信息参考:http://dbi.perl.org/ tar xzf DBI-1.620.tar.gz 进入解压包内 perl Makefile.PL make test make make install (如果不是root用户,要sudo一下) 1.下载相关软件 unixODBC、freetds和DBD-ODBC
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代表端口,测试连接; 其配置项解释如下:
initial block size: 此值只能取512的倍数,默认为512,指定了协议块的最大值,
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 注意,client charset 必需大于或等于服务端数据库使用的字符集. 例如,服务端数据库是 MS SQL Server 2000,字符集是 GB2312. # 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] 保存退出 添加DSN
# 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 = 或者
保存并退出,测试ODBC的连接 # bin/isql -v 123 sa passwordSQL> 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. 则运行如下: ?# find / -name "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 注意是 $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其他语言类推可解) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |