Perl - 查询获取非哈希参考时DBI selectall_arrayref

时间:2010-10-05 09:57:00

标签: sql-server perl dbi

我是perl的新手(但是来自c#背景)并且我正在尝试将一些脚本移动到Windows框中。 由于某些模块无法轻松使用Windows,因此我改变了连接数据库的方式。 我有一个sqlserver数据库,我有一个循环读取表中的每一行,然后在这个循环内发送另一个查询来选择不同的信息。 我是错误,在同一连接中无法一次执行两个语句。 由于我的连接对象是全局的,我无法看到一个简单的方法,因此决定使用以下方法将第一组数据存储在数组中:

my $query = shift;
    my $aryref = $dbh->selectall_arrayref($query) || die "Could not select to array\n";
    return($aryref);

(这是在一个名为的模块文件中)

然后我做一个foreach循环(其中@ $ s_study是上面返回的$ aryref)

  foreach my $r_study ( @$s_study ) {
    ~~~             
    my $surveyId=$r_study->{surveyid};  <-------error this line
 ~~~~               
        };

当我运行此操作时,我收到错误“不是哈希引用”。我不明白?! 任何人都可以帮忙!

贝克斯

3 个答案:

答案 0 :(得分:8)

如果您希望将每一行存储为哈希值,则需要向selectall_arrayref提供{ Slice => {} }参数:

my $aryref = $dbh->selectall_arrayref($query, { Slice => {} });

默认情况下,它返回对数组的引用,该数组包含对每个提取数据行的数组的引用。

答案 1 :(得分:1)

$r_study->{surveyid}是一个hashref

$r_study->[0]是一个arrayref

这是你的错误。 你应该使用第二个

答案 2 :(得分:0)

如果您遇到方法问题,那么第一步是阅读该方法的文档。这是selectall_arrayref文档的链接。它说:

  

这种实用方法结合起来   “准备”,“执行”和   “fetchall_arrayref”变为单一   呼叫。它返回一个引用   包含对引用的数组   每个的数组(或哈希,见下文)   提取的数据行。

因此,默认行为是返回对每行包含数组引用的数组的引用。这解释了你的错误。您正在获取数组引用,并且您正在尝试将其视为哈希引用。我不确定错误会更清楚。

然而,有一个有趣的地方,它说“或哈希,见下文”。继续阅读,我们发现:

  

您可能经常想要获取数组   每行存储为的行数   哈希值。这可以通过以下方式简单地完成:

my $emps = $dbh->selectall_arrayref(
    "SELECT ename FROM emp ORDER BY ename",
    { Slice => {} }
);
foreach my $emp ( @$emps ) {
    print "Employee: $emp->{ename}\n";
}

所以你有两个选择。切换代码以使用数组ref而不是散列引用。或者在调用中添加“{Slice =&gt; {}}”选项,这将返回散列引用。

文档很清楚。非常值得一读。