DBD::ODBC編

DBD::ODBCのインストール
#perl -MCPAN -e shell
cpan> install DBD::ODBC
--20:01:22--  ftp://ftp.perl.org/pub/CPAN/authors/id/M/MJ/MJEVANS/DBD-ODBC-1.15.tar.gz
  (試行: 9) => `-'
ftp.perl.org|163.143.1.21|:21 に接続しています... 接続しました。
anonymous としてログインしています...
サーバの応答にエラーがあるので、接続を終了します。
再試行しています。

あれ?失敗

■接続先URLを追加して実行(以下でいけるらしい)

cpan> o conf
cpan> o conf urllist push 追加したい url名
cpan> o conf commit

◎追加するURLは
http://search.cpan.org/CPAN/authors/id/M/MJ/MJEVANS/DBD-ODBC-1.15.tar.gz

cpan使っても一回install

#perl -MCPAN -e shell
cpan> install DBD::ODBC

◎警告はわさわさ出たけど入ったから次へ。


7.接続テストスクリプト作成

# vim odbc.pl
--
#!/usr/bin/perl

use strict;
use DBI;
use Data::Dumper;

my $dbh = DBI->connect('dbi:ODBC:freetds', 'username', 'passwd') or die $!;
my $sth = $dbh->prepare("select top 10 * from test_table") or die $dbh->errstr;
$sth->execute or die $dbh->errstr;
while (my $arrayref = $sth->fetchrow_arrayref) {
    print Dumper $arrayref;
}
$sth->finish;
$dbh->disconnect;

8.接続テストスクリプト実行

# perl odbc.pl
DBI connect('freetds','username',...) failed: [unixODBC][Driver Manager]Data source name not found, and no default driver specified (SQL-IM002) at odbc.pl line 7
Died at odbc.pl line 7.

エラー
データソースの設定がミスってますって怒られています。

ここからしばらくデバッグの経緯です。(省きたい人はすっとばしてください。)

■ドライバの一覧を確認してみます
odbc.pl に以下の記述を追加して実行

my @ary = DBI->available_drivers;
print Dumper(\@ary);

 ------実行結果-------
#perl odbc.pl
$VAR1 = [
          'DBM',
          'ExampleP',
          'File',
          'ODBC', ←いました。
          'Pg',
          'Proxy',
          'Sponge'
        ];


ODBCの一覧を見てみます

my @ary = DBI->data_sources('ODBC');
print Dumper(\@ary);

 ------実行結果-------
#perl odbc.pl
$VAR1 = [];

からっぽです。

■今どの設定ファイルみてるのかを調べる

#odbcinst -j
unixODBC 2.2.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
USER DATA SOURCES..: /root/.odbc.ini

↑こんな結果です。

どうやら「/etc/odbc.ini」を見ているようです。
設定をこちらに書いてみます。

■再実行結果

#perl odbc.pl
$VAR1 = [
          'dbi:ODBC:freetds'
        ];

とれました。

■再度perl実行

# perl odbc.pl

できたーーーーー!!!
・゚・(つД`)・゚・値がとれましたー!!

↑ここまではasciiだけのテーブルが対象でした。