内容
odbcとfreetdsを利用したsql serverへの接続方法を紹介する記事は多いです。
それらの記事は、sql serverの接続情報(IP アドレス、ポート番号等)を別ファイルに予め定義しておき、
その定義された設定を利用してsql serverに接続するというものでした。
この方法では予め接続するDBが限定されているケースでは有効ですが、接続DBが限定されないケースでは
不都合です。
ソースコード内で接続する情報(IP アドレス、ポート等)を動的に設定したいケースがありましたので、
その方法を紹介します。
ここでは/etc/odbc.iniやfeetds.confの設定情報を参照しないで、FreeTDSとDBD::ODBCを利用した DSN lessな接続方法を紹介します。
環境
- CentOS 6.7 64bit
- unixODBC 2.2.14
- freetds v0.91
手順
下記を順に実行する
- unixodbc, freetdsのインストール
sudo yum install unixODBC-devel.x86_64
sudo yum install freetds-devel.x86_64
- driver情報の登録
/etc/odbcinst.iniに以下を追加
[FreeTDS]
Description = FreeTDS for SQL Server
Driver64 = /usr/lib64/libtdsodbc.so
Setup64 = /usr/lib64/libtdsS.so
FileUsage = 1
CPTimeout = 5
CPReuse = 5
UsageCount = 1
- DBD::ODBCのインストール
cpanm DBI
cpanm DBD::ODBC
サンプルコードの実行
以下のスクリプトを実行する
use strict;
use warnings;
use utf8;
use DBI;
use Data::Dumper;
# DB名:sample_db
# ログインID:sa
# パスワード:password
my $dsn = "dbi:ODBC:DRIVER={FreeTDS};Server=192.168.56.100;Database=sample_db;Port=1433;";
#"Trusted_Connection=yes;". # yesだとWindows認証
#"AutoTranslate=No;";
my $dbh=DBI->connect($dsn.'uid=sa;'.'pwd=password') or die $!;
my $sql = "
select * FROM test
";
my $sth=$dbh->prepare($sql) or die $dbh->errstr;
# 出力エラー対策
$sth->{LongTruncOk}=1;
$sth->{LongReadLen}=2000000;
$sth->execute or die $dbh->errstr;
while(my $arrayref = $sth->fetchrow_arrayref){
print Dumper $arrayref;
}
$sth->finish;
$dbh->disconnect;
日本語の後半部分が見切れる問題に関して
日本語が格納されている列ではデータの後半部分が見切れる問題があります。
DBD::ODBCがデフォルトではUnicodeサポートがされないためです。(*参考文献 Enabling and Disabling Unicode supportを参照)
データベース内で日本語を格納している場合は、以下の手順1,もしくは手順2でDBD::ODBCをインストールして下さい。
- DBD::ODBCインストール手順1
cpanm DBD::ODBC --configure-args="-u"
- DBD::ODBCインストール手順2
cpanm DBD::ODBC --look
perl Makefile.PL -u
make
make test
make install
tsqlによる接続
FreeTDS 付属のtsqlコマンドでSQL Serverサーバへ接続することも可能です。
$ tsql -I FreeTDS -S 192.168.56.100 -D sample_db -P 1433 -U sa -P password
参考文献
以上
CHANGELOG
2016/12/16 日本語が見切れる問題を追加
2016/12/13 tsql 追加, 段落、タイトル修正