2010-12-03 5 views
4

Voici un extrait de code d'une application de base de données SQLite Je travaille sur:SQLite3 de Perl: {NAME} ne fonctionne pas?

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

La requête se déclenche de très bien, et en fait, il renvoie les résultats corrects. Cependant, pour quelque raison que ce soit, cette ligne

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

Echoue. {NAME} ne retourne jamais le arrayref auquel je m'attendais. Si je supprime la clause die, elle fonctionne correctement (en lançant l'avertissement "using uncinitialized values" prévu partout où j'utilise des noms $, bien sûr).

Y a-t-il une raison évidente qui me manque pour que {NAME} ne se déclenche pas, étant donné que la requête a bien fonctionné?

Merci!

+0

Alors que là, pourriez-vous s'il vous plaît préciser pour la valeur éducative de non-initié ce que l'attribut "NAME" de l'objet de déclaration fait? Je ne pouvais pas obtenir une réponse directe de DBI POD ou de la source à première vue. Est-ce une référence de tableau pour les noms de colonnes? +1 pour Q et A – DVK

+0

La raison pour laquelle NAME n'est pas disponible après fetchall_arrayref est que l'instruction n'est plus active une fois que toutes les lignes ont été récupérées. – bohica

Répondre

5

Une grosse erreur de ma part. Commutation de deux lignes pour que ce soit

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

Corrige le problème. Je suppose que je dois saisir {NAME} directement après execute() (ou plutôt, avant que $ sth ne change). Je ne m'attendais pas à ce que fetchall_arrayref efface {NAME}.

Fonctionne maintenant! Désolé pour le poste. Je laisserai cela à la postérité jusqu'à ce que quelqu'un décide que ça ne vaut pas la peine. :-)

+0

Puisque vous avez trouvé la bonne réponse, allez-y et acceptez-la dès qu'elle vous le permet. – ysth