2008-10-13 5 views
4

Pour une raison quelconque, j'ai des problèmes avec un handle DBI. En fait ce qui est arrivé est que je fait une fonction spéciale de connexion dans un module Perl et passe de faire:Pourquoi la méthode d'annulation ne serait-elle pas disponible pour un descripteur DBI?

do 'foo.pl' 

à

use Foo; 

puis je

$dbh = Foo->connect; 

Et maintenant quelques-uns raison que je continue à obtenir l'erreur:

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

Donc la chose étrange est que $ dbh n'est certainement pas un Foo, c'est juste défini dans foo. De toute façon, je n'ai eu aucun problème avec ça jusqu'à maintenant. Des idées quoi de neuf?

Modifier: @Axeman: connect n'existait pas dans l'original. Avant de nous venons d'avoir une chaîne que nous avons utilisé comme ceci:

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

et ainsi connect est quelque chose comme ça

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

Avez-vous changé l'appel de connexion? – Axeman

Répondre

4

De perlfunc:

 
     do 'stat.pl'; 

    is just like 

     eval `cat stat.pl`; 

Alors, quand vous do 'foo.pl', vous exécutez le code dans le contexte actuel. Parce que je ne sais pas ce qui se passe dans foo.pl ou Foo.pm, je ne peux pas vous dire ce qui a changé. Mais, je peux vous dire que c'est toujours exécuté dans le contexte actuel et qu'il s'exécute maintenant dans l'espace de noms Foo::.

La façon dont vous appelez cela, vous passez 'Foo' en tant que premier paramètre à Foo::connect ou le sous-retour de Foo->can('connect'). Il semble que cela soit transmis à un code qui pense qu'il s'agit d'un handle de base de données, et qui indique cet objet à rollback.

+0

Ouais, c'était l'erreur. Je voulais une méthode statique et je prétendais que Foo était une classe, et ce n'est pas, c'est un paquet. Merci! –

3

Je suis d'accord avec Axeman. Vous devriez probablement appeler votre fonction en utilisant

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

au lieu de Foo-> connect();

7

Nous devons voir le code actuel dans Foo pour pouvoir répondre à cette question. Vous voulez probablement lire Subclassing the DBI dans la documentation pour voir comment le faire correctement. Fondamentalement, vous avez besoin de Foo pour sous-classer DBI correctement (encore une fois, vous aurez besoin de lire les docs), ou vous devez déclarer une fonction connect pour déléguer correctement à la méthode DBI :: connect. Attention cependant à l'écriture d'un wrapper produitural pour le code OO. Il devient terriblement difficile de maintenir l'état de cette façon.

Questions connexes