• HOME
  • DOCS
  • WTF
  • TECH
  • LIFE
  • PAGES
    • ARCHIVE
    • TAGS
    • ABOUT
    • FRIENDS
    • RSS
  • TOOLS
    • GEO
    • RANDOM()
    • GOO.GL
    • CSS HEART
Aj's Blog

记录时间溜走的瞬间和折腾过的那些事

Perl: DBI::ODBC操作Microsoft Access
2011-01-01 @ TECH

首先,Perl的DBI::ODBC模块检查,运行ppm list 检查DBI::ODBC模块是否正确安装。
我之前用的Perl5.8就没有ODBC模块 需要自行安装。
自行安装模块在Windows XP下会遇到很多问题。关于如何在windows xp下安装perl模块。下一篇文章会详细介绍。

这里我们回到重点,DBI:ODBC的使用

OS:  Windows XP SP3
Perl: 5.12.2
DBI用法: http://search.cpan.org/~timb/DBI-1.616/DBI.pm
下面直接看实例,模仿ASP链接Access方法,这样对于我来说更容易看懂。

#声明调用DBI类,实际上我们是用的DBI::ODBC子类
use DBI;

#数据源:数据库./proxy.mdb(当前目录下),表proxy,字段ip、portmy
$connstr = "driver=Microsoft Access Driver (*.mdb);dbq=./Proxy.mdb";

#数据库链接对象
my $conn = DBI->connect("dbi:ODBC:$connstr",'','') or die "Can't connect to Database: $DBI::errstr";

#查询语句:读取前10条
my $query = "select top 10 ip,port from proxy";

#预处理
my $recordset = $conn->prepare($query) or die "Can't prepare statement: $DBI::errstr";

#返回结果
my $records = $recordset->execute or die "Can't execute statement: $DBI::errstr";

#定一个空数组,用来存储代理数据
my @pxy;

#读取数据循环
while($col=$recordset->fetchrow_arrayref){
    #将代理数据逐个push入@pxy数组,格式为ip:port
    push @pxy,"$col->[0]:$col->[1]";}

#显示数组:用于检查
foreach $tmp(@pxy){print "$tmp\n";}

#返回数据错误则终止程序
die $record->errstr if $record->err;

#关闭数据库链接
$conn->disconnect;

遗留问题:返回数据能否一次性全部传递给数组并调用?

在DBI使用说明中看到了 $sth->fetchall_arrayref 的方法,但是注意返回值是一个句柄,也就是说是一个地址。

The fetchall_arrayref method can be used to fetch all the data to be returned from a prepared and executed statement handle. It returns a reference to an array that contains one reference per row.

#返回所有数据所在数组的地址
$all = $record->fetchall_arrayref();

#如何调用这个数组呢,今天学到了方法:@{$all}
print @{$all};
#print后发现,数组的子元素全是数组地址,为什么?
#因为每一行数据返回都是数组格式的,hash方式调用的话就是fetchall_hashref。
#因为我们预先知道是2列数据。所以就直接固化调用了
foreach $tmp(@{$all}){
     #每一行: @{$tmp}
     #ip: @{$tmp}[0]
     #port: @{$tmp}[1]
     print "@{$tmp}[0]:@{$tmp}[1]\n";
}

由上可知,最初的想法:返回数据能否一次性全部传递给数组并调用。不可能实现。

哈哈哈。新年快乐!

下一篇:   Windows XP下如何安装perl模块(Dmake.exe)
上一篇:   2011
暂无评论

Cancel reply