由于工作需要,在linux系统中使用perl 连接sql server,在网上找了一些网站,但大多是复制粘贴的,没有实际操作过,报错也没法找到原因。故整理了一下自己链接的过程,中间遇到的问题,使共同学习。
1、下载相关软件 unixODBC、freetds和DBD-ODBC
①、Linux系统的ODBC
unixODBC-2.3.4.tar.gz ( http://www.unixodbc.org)
②、连接SQLServer或Sybase的驱动
freetds-patched.tar.gz ( http://www.freetds.org)
③、perl的ODBC模块
DBD-ODBC-1.56.tar.gz ( DBD::ODBC - ODBC Driver for DBI - metacpan.org)
2、安装
1. 安装unixODBC
# tar vxzf unixODBC-2.3.4.tar.gz
# cd unixODBC-2.3.4
# ./configure --prefix=/usr/local/unixODBC
# make & make install
2、安装freetds
# tar vxzf freetds-patched.tar.gz
# cd freetds-patched
# ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/freetds
# make & make install
3、安装DBD-ODBC
在安装之前要先设置一下环境变量
vim ~/.bashrc
SYBASE=/usr/local/freetds; export SYBASE;
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/freetds/lib/
export ODBCINI=/usr/local/unixODBC/etc/odbc.ini
export ODBCSYSINI=/usr/local/unixODBC/etc
source ~/.bashrc
之后开始编译安装
# tar vxzf DBD-ODBC-1.56.tar.gz
# cd DBD-ODBC-1.56
# perl Makefile.PL INSTALL_BASE=/usr/local
#make & make install
3、配置
①、配置freetds
# cd /usr/local/freetds 进入自定义安装的目录
# vi freetds.conf
添加如下内容:
[SS_MY_DB]
host = 数据库ip地址或者主机名 # or host name port = 1433
port = 1433
tds version = 7.3
测试连接;
# bin/tsql -S SS_MY_DB -H ip地址 -p 1433 -U sa -P password
1> use xxx
2> go
1> select count(*) from xxx
2>
4
1> quit
说明:-S SS_MY_DB是在freetds.conf中定义好的,-H 后面跟服务器IP地址,和freetds.conf中的一致,-S这个参数可以不用
-p 1433用来指定端口是1433 ,-U sa用来指定连接数据库的用户名,-P password用来指定连接数据库的密码。
②、配置unixODBC
# cd /usr/local/unixODBC
向ODBC添加SQLServer驱动
# vi odbcinst.ini
写入如下内容: 说明
[DM7 ODBC DRIVER]
Description=MS-SQLServer
Driver=/usr/local/freetds/lib/libtdsodbc.so ;这个一定要找对驱动
[dm]
Description=DM ODBC DSN
Driver=DM7 ODBC DRIVER ;这个一定要跟odbcinst.ini里面的标识一致
Server=ip地址
Database=oareportbase
Port=1433
UsageCount=1
# vi odbc.ini
写入如下内容 说明
[dm]
Description=DM ODBC DSN
Driver=DM7 ODBC DRIVER
Server=10.28.250.21
Database=oareportbase
Port=1433
保存并退出,测试ODBC的连接,最好是将安装的bin目录添加到环境变量,不然每次都需输入全路径
测试 /usr/local/unixODBC/bin/isql -v dm user pwd
user : 数据库用户名
pwd:数据库密码
4、遇到的问题及解决方法:
1. [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed
unixODBC里面的odbcinst.ini中的驱动不对,需要找freetds/lib 里面的驱动
2.odbcinst -j 可以查看路径不对的话,需要设置环境变量
3. Unable to connect to data source
找到不数据源,把odbc.ini配置里面的UID和PWD删除
5、连接数据库
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use POSIX qw(strftime);
use POSIX;
my $dbh_sql_server = &connSqlServer();
my $dbh_mysql = &connMysql();
my $source = &getSqlServerData();
&insertDB();
&destroy();
sub connSqlServer{
# my $host = 'zxshoareport';
# my $database = 'oareportbase';
my $user = '用户名';
my $auth = '密码';
# Connect via DBD::ODBC by specifying the DSN dynamically.
my $dbh = DBI->connect("dbi:ODBC:dm",
$user,
$auth,
{ RaiseError => 1, AutoCommit => 1}
) || die "Database connection not made: $DBI::errstr";
return $dbh;
}
sub getSqlServerData{
#Prepare a SQL statement
my $sql = " select * from V_EmployeesFromEHR";
my $sth = $dbh_sql_server->prepare( $sql );
#Execute the statement
$sth->execute();
#Retrieve values from the result set
my @data;
while(@data = $sth->fetchrow_array() ) {
print $data[0];
}
$sth->finish();
return $data[0];
}
sub destroy{
#Close the connection
$dbh_sql_server->disconnect();
}
5. 结尾
给个小小的鼓励!
若上面的代码有任何问题,随时联系。