2010-12-03 4 views
4

는 여기에 내가 일하고 있어요 SQLite는 데이터베이스 응용 프로그램에서 코드 조각입니다 :펄의 SQLite3 : {이름}이 (가) 작동하지 않습니까?

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}은 (는) 기대했던 arrayref를 반환하지 않습니다. die 절을 꺼내면 잘 실행됩니다 (당연히 $ names를 사용하는 곳에서는 "초기화되지 않은 값 사용"경고를 던집니다).

쿼리가 제대로 작동 했으므로 {NAME}이 (가) 실행되지 않는다는 분명한 이유가 있습니까?

감사합니다.

+0

성명서 객체의 "NAME"속성이 수행하는 교육적 가치가 무엇인지 명확히 설명해주십시오. 언뜻보기에는 DBI POD 나 소스에서 직접 답변을 얻을 수 없었습니다. 열 이름에 대한 배열 참조입니까? +1 Q와 A 모두 +1 – DVK

+0

fetchall_arrayref 다음에 NAME을 사용할 수없는 이유는 가져온 모든 행을 가져 오면 해당 명령문이 더 이상 활성화되지 않기 때문입니다. – bohica

답변

5

큰 일로 골치 아픈 실수가 있습니다. 두 줄을 전환하여

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

수정합니다. 나는 execute() 후에 (즉, $ sth 변경 전에) {이름}을 잡아야 만한다고 생각합니다. {name}을 (를) 지우기 위해 fetchall_arrayref를 (를) 기대하지 않았습니다.

지금 사용하십시오! 미안 해요. 나는 누군가가 그것이 공간의 가치가 없다고 결정할 때까지 이것을 후세에 남겨 둘 것이다. :-)

+0

정답을 발견 했으므로 가능한 한 빨리 수락하십시오. – ysth

관련 문제