2008-10-13 3 views
4

어떤 이유로 DBI 핸들에 문제가 있습니다. 기본적으로 무슨 일이 것은 내가 펄 모듈에 특별한 연결 기능을 만든 것이 었습니다 및 수행에서 전환 :DBI 핸들에서 롤백 메서드를 사용할 수없는 이유는 무엇입니까?

do 'foo.pl' 

일부

use Foo; 

에 다음 나는

$dbh = Foo->connect; 

을 그리고 지금 오류가 계속 표시되는 이유 :

Can't locate object method "rollback" via package "Foo" at ../Foo.pm line 171.

이상한 점은 $ dbh는 Foo가 아니기 때문에 foo에 정의 된 것입니다. 어쨌든, 지금까지는 아무런 문제가 없었습니다. 무슨 아이디어있어?

편집 : @Axeman : connect은 원본에 없습니다. 우리는 단지 우리가 같이 사용되는 문자열을했다 전에 : do 'foo.pl', 당신은 실행 그래서

 
     do 'stat.pl'; 

    is just like 

     eval `cat stat.pl`; 

:

do 'foo.pl'; 
$dbh = DBI->connect($DBConnectString); 

connectperlfunc에서이

sub connect { 
    my $dbh = DBI->connect('blah'); 
    return $dbh; 
} 
+0

연결 통화를 변경 했습니까? – Axeman

답변

4

같은 것입니다 현재 컨텍스트의 코드 foo.pl 또는 Foo.pm에서 무슨 일이 일어나는지 알 수 없으므로 변경 내용을 말할 수는 없습니다. 하지만, 현재 컨텍스트에서 항상 실행되며 이제는 Foo:: 네임 스페이스에서 실행된다고 말할 수 있습니다.

이 호출 방법은 을 첫 번째 매개 변수로 Foo::connect 또는 Foo->can('connect')에서 반환 된 하위로 전달하는 것입니다. 그것은 어떻게 든 그것이 데이터베이스 핸들이라고 생각하는 코드에 전달되는 것 같습니다. 그리고 그것은 그 객체를 rollback으로 말하고있는 것입니다.

+0

그래, 그게 잘못이야. 나는 정적 인 방법을 원했고 Foo가 수업이었던 것처럼 보였습니다. 그리고 그것은 아닙니다, 패키지입니다. 감사! –

3

나는 Axeman에 동의합니다. 아마도 Foo-> connect(); 대신에

use Foo; 
... 
$dbh = Foo::connect(); 

을 사용하여 함수를 호출해야합니다.

7

답변을 받으려면 Foo에서 실제 코드를 확인해야합니다. 이 작업을 올바르게 수행하는 방법은 설명서에서 Subclassing the DBI을 읽어보십시오.

기본적으로 Foo를 사용하여 DBI를 적절하게 서브 클래스 화하거나 (다시 말하면 문서를 읽어야 함) DBI :: connect 메소드에 올바르게 위임하기 위해 연결 함수를 선언해야합니다. 그래도 OO 코드 용 제작 된 래퍼를 작성하는 데주의해야합니다. 그렇게 상태를 유지하기가 몹시 어렵습니다.

관련 문제