Perl在linux如何链接Sql Server数据库

        由于工作需要,在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. 结尾

       给个小小的鼓励!

        若上面的代码有任何问题,随时联系。

         

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值