• 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、连接数据库

    1. #!/usr/bin/perl
    2. use strict;
    3. use warnings;
    4. use DBI;
    5. use POSIX qw(strftime);
    6. use POSIX;
    7. my $dbh_sql_server = &connSqlServer();
    8. my $dbh_mysql = &connMysql();
    9. my $source = &getSqlServerData();
    10. &insertDB();
    11. &destroy();
    12. sub connSqlServer{
    13. # my $host = 'zxshoareport';
    14. # my $database = 'oareportbase';
    15. my $user = '用户名';
    16. my $auth = '密码';
    17. # Connect via DBD::ODBC by specifying the DSN dynamically.
    18. my $dbh = DBI->connect("dbi:ODBC:dm",
    19. $user,
    20. $auth,
    21. { RaiseError => 1, AutoCommit => 1}
    22. ) || die "Database connection not made: $DBI::errstr";
    23. return $dbh;
    24. }
    25. sub getSqlServerData{
    26. #Prepare a SQL statement
    27. my $sql = " select * from V_EmployeesFromEHR";
    28. my $sth = $dbh_sql_server->prepare( $sql );
    29. #Execute the statement
    30. $sth->execute();
    31. #Retrieve values from the result set
    32. my @data;
    33. while(@data = $sth->fetchrow_array() ) {
    34. print $data[0];
    35. }
    36. $sth->finish();
    37. return $data[0];
    38. }
    39. sub destroy{
    40. #Close the connection
    41. $dbh_sql_server->disconnect();
    42. }

    5. 结尾

           给个小小的鼓励!

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

             

  • 相关阅读:
    Voice Control for ChatGPT简单高效的与ChatGPT进行交流学习。
    持续交付到底有什么价值?
    不同图像的噪声,选用什么滤波器去噪,图像处理的噪声和处理方法
    [附源码]java毕业设计同城搬家平台
    git命令整理
    常用Linux命令
    Feign接口调用GET请求@RequestParam传参丢失
    实时云渲染技术,元宇宙应用的核心之一
    操作系统学习笔记2 | 操作系统接口
    解决小程序自定义弹窗滚动穿透问题
  • 原文地址:https://blog.csdn.net/ywCSD/article/details/126518925