2010-10-05 59 views
2

我是非常新的perl(但來自c#背景),我試圖將一些腳本移動到一個窗口框。 由於某些模塊無法輕鬆使用Windows,因此我改變了連接到數據庫的方式。 我有一個sqlserver數據庫,我有一個循環讀取表中的每一行,然後在此循環內發送另一個查詢來選擇不同的信息。 我是兩個語句不能同時在同一個連接中執行的錯誤。 由於我的連接對象是全球性的我看不到一個簡單的辦法解決這,所以決定將第一組數據存儲在數組中使用:Perl -DBI selectall_arrayref當查詢得到不哈希引用

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 
~~~~    
     }; 

當我運行此我得到一個錯誤「不是一個散列引用」。我不明白?! 任何人都可以幫忙!

貝克斯

回答

1

$r_study->{surveyid}是hashref

$r_study->[0]是一個數組引用

這是你的錯誤。 您應該使用第二個

+0

啊..有無論如何我可以通過名稱查詢列?我需要「數據集」離線... – Bex 2010-10-05 11:29:31

+0

如果你想要一個hashref,你應該可以調用'selectall_hashref'。查看這裏的完整文檔:http://search.cpan.org/~timb/DBI/DBI.pm#selectall_hashref – dsolimano 2010-10-05 12:29:20

+1

selectall_hashref返回哈希引用的哈希引用。 Bex想要一個哈希引用的數組ref。所以selectall_arrayref是正確的方法 - 但增加了{Slice => {}}。 – 2010-10-05 12:39:26

8

你需要的,如果你想每一行存儲爲散列提供{ Slice => {} }參數selectall_arrayref

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

默認情況下,它返回一個包含引用到一個數組對獲取的每行數據的數組引用。

+0

我第一次嘗試這個,但刪除它,因爲我認爲這是造成的錯誤..我認爲下面的benzebuth可能有它? – Bex 2010-10-05 11:30:10

0

如果您遇到方法問題,那麼首先要閱讀該方法的文檔。這是selectall_arrayref文檔的鏈接。它說:

This utility method combines "prepare", "execute" and "fetchall_arrayref" into a single call. It returns a reference to an array containing a reference to an array (or hash, see below) for each row of data fetched.

所以默認行爲是一個參考返回到其中包含的每一行的數組引用的數組。這解釋了你的錯誤。你正在獲得一個數組引用,並且你正試圖將它作爲一個哈希引用。我不確定這個錯誤可能會更清楚。

然而,它有一個有趣的地方,它說「或散列,見下文」。閱讀,我們發現:

You may often want to fetch an array of rows where each row is stored as a hash. That can be done simple using:

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

所以你有兩個選擇。要麼將您的代碼切換到使用數組ref而不是哈希引用。或者將「{Slice => {}}」選項添加到調用中,該選項將返回一個哈希引用。

該文件是明確的。這非常值得一讀。

+0

Davorg ..這是我正在閱讀的確切文章..我已經完成了你的第二個例子顯示,那是當我得到錯誤「不哈希參考」。這是「哈希」的整個概念,我不明白......爲什麼這個例子不適合我! Ps ..我確實有切片開始..但刪除它發現衝突的文件..任何方式都行不通! – Bex 2010-10-05 12:49:13

+0

好的。我懷疑我們可能在這裏完全走錯了方向。在將應用程序移至Windows之前,我假設代碼正在工作(使用Slice => {})。所以我想知道問題是你的Windows機器有不支持該語法的舊版DBI。你可以嘗試在兩個系統上運行「perl -MDBI -le'print $ DBI :: VERSION」,以報告你安裝的DBI的版本。您可能需要更新Windows系統上的DBI版本。 – 2010-10-05 13:03:42

+0

我剛剛檢查了更改日誌(http://search.cpan.org/~timb/DBI/Changes),並在2001年發佈的DBI 1.20版中添加了Slice => {}語法。我真的希望你'不使用舊版本:-) – 2010-10-05 13:05:52