首页 > 数据库 >perl通过unixODBC连接SQLServer

perl通过unixODBC连接SQLServer

时间:2023-08-08 22:36:54浏览次数:48  
标签:SQLServer unixODBC ODBC perl usr freetds local


本文讲述三个内容:

一:说明

二:环境配置

三:操作脚本内容




一:说明

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


标签:SQLServer,unixODBC,ODBC,perl,usr,freetds,local
From: https://blog.51cto.com/u_16218512/7013080

相关文章

  • perl基本语言语法(与java,c#不同的地方积累)
    连接字符串 perl用.  “hello”+"hello" 可用x号 "hello"*3 “hellohellohello”java,c#用+"hello"+"hello"运算符perl等待输入:$line=<STDIN>;或者$line=<>;未定义的字符值undef--不会报错当作数字使用时为0当作字符串使用时为空判断是否为空用defined()数组......
  • HandlerSocket的perl接口操作方法
    实例化:/*   *String $host:MySQLip;  *String $port:handlersocket插件的监听端口,它有两个端口可选:一个用于读、一个用于写   */ $hs=newHandlerSocket($host,$port);运用例子:#9998为读取端口详见上一篇handlersocket的安装my$args={host=>'loca......
  • sqlserver 数据库显示 正在还原
    问题描述之前不太会搞差异备份的恢复,然后恢复发生了失败之后这个数据库一直处于(正在还原……状态并且出现数据库无法访问的情况尝试解决1执行查询RestoreDatabase数据库名称withRecovery然后不太能行 2执行查询RestoreDatabase数据库名称withNoRecovery似乎没有报......
  • 无涯教程-Perl - getgrnam函数
    描述此功能通过组名查找组文件条目。在列表context中返回以下内容-($name,$passwd,$gid,$members)$members标量包含作为组成员的登录名的空格分隔列表。在标量context中返回组名。有关检索整个组文件的更有效方法,请参阅getgrent。在Windows下,请考虑使用Win32API::Net模块。......
  • 无涯教程-Perl - format函数
    如前所述,Perl代表实用提取和报告语言,我们现在将讨论使用Perl编写报告。Perl使用称为"格式"的书写模板来输出报告。要使用Perl的格式功能,您必须-定义格式PassthedatathatwillbedisplayedontheformatInvoketheFormat定义格式以下是定义Perl格式的语法format......
  • 记录:jdbc调用sqlserver存储过程
    1、现场为内网环境,不利于测试2、调用sqlserver存储过程,报错:为过程或函数**指定了过多的参数一、制作本地sqlserver环境1、docker安装sqlserver#获取镜像dockerpullmcr.microsoft.com/azure-sql-edge#启动账号:sa密码:Password@dockerrun-e'ACCEPT_EU......
  • 无涯教程-Perl - exp函数
    描述此函数将e(自然对数底数)返回到EXPR的幂。如果省略EXPR,则给出exp($_)。语法以下是此函数的简单语法-expEXPRexp返回值此函数不返回任何值。参考链接https://www.learnfk.com/perl/perl-exp.html......
  • perl字符串转义以及字符串含.号等特殊符号时的用法
    Perl中的单引号字符串不支持转义字符,双引号字符串支持转义字符如下双引号中的\t \x \r \n是有作用的 单引号中的无作用$cattest_stresc.pl#!/usr/bin/perlusewarnings;usestrict;my$str_sq='1Aa\t\x31\x41\x61\t\x{263a}\r\n';my$str_dq="1Aa\t\x31\x41\x......
  • SqlServer时间格式化
       sqlserver日期格式化中文-年月日selectconvert(varchar,datepart(yy,getdate()))+N'年'+convert(varchar,datepart(mm,getdate()))+N'月'+convert(varchar,datepart(dd,getdate()))+N'日',cast(datepart(yy,getdate())asvarchar)+N'年......
  • 无涯教程-Perl - endnetent函数
    描述此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。语法以下是此函数的简单语法-endnetent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perluseSocket;while(($name,$aliases,$addrtype,$net)=getnetent())......