2010-12-03 4 views
4

Вот фрагмент кода из SQLite базы данных приложения Я работаю над:Perl's SQLite3: {NAME} не работает?

my $query = "select * from pins"; 
my $sth = $dbh->prepare($query) or die "Couldn't prep: $DBI::errstr"; 
$sth->execute or die "Exec problem: $DBI::errstr"; 
my $result = $sth->fetchall_arrayref(); 
my $names = $sth->{NAME} or die "Name failed: $DBI::errstr"; 
foreach my $row (@$res) { 
    # ... do some row-specific things 
    foreach my $cell (@$row) { 
     # ... do some cell-specific things 
    } 
} 

Запрос выстреливает просто отлично, а на самом деле она возвращает правильные результаты. Однако по какой-то причине эта линия,

my $names = $sth->{NAME} or die "Name failed: $DBI::errstr"; 

Не удалось. {NAME} никогда не возвращает массив, который я ожидал бы. Если я беру предложение die die, он работает отлично (бросая ожидаемое «использование неинициализированных значений» предупреждение, где бы я не использовал $ names, конечно).

Есть ли какая-то очевидная причина, по которой мне не хватает, что {NAME} не срабатывает, учитывая, что запрос работал нормально?

Спасибо!

+0

В то же время, не могли бы вы прояснить для значения образования без инициации, что делает атрибут «ИМЯ» объекта утверждения? Я не мог получить прямой ответ из DBI POD или источника с первого взгляда. Является ли ссылка массива для имен столбцов? +1 для обоих Q и A – DVK 2010-12-04 01:27:39

+0

Причина NAME недоступна после того, как fetchall_arrayref - это то, что оператор больше не активен после того, как все строки извлечены. – bohica 2012-05-01 07:25:51

ответ

5

Большая носовая ошибка с моей стороны. Переключение двух линий так, чтобы оно было

my $names ... 
my $result ... 

Исправления. Думаю, мне нужно захватить {NAME} непосредственно после execute() (или, вернее, до $ sth изменений). Я не ожидал, что fetchall_arrayref уничтожит {NAME}.

Работы сейчас! Извините за сообщение. Я оставлю это для потомков, пока кто-то не решит, что это не стоит пространства. :-)

Смежные вопросы