2009-05-22 5 views

Répondre

4

Vous devez utiliser DBI et vous êtes probablement mieux à l'aide le fournisseur DBD :: ODBC de (CPAN). Si vous ne connaissez pas DBI, alors vous devez lire à ce sujet. Il y a un livre (Programming the Perl DBI) qui est ancien mais toujours valide.

Puis quelque chose comme ce qui suit:

use strict; 
use warnings; 
use DBI; 

# Insert your DSN's name here. 
my $dsn = 'DSN NAME HERE' 

# Change username and password to something more meaningful 
my $dbh = DBI->connect("DBI:ODBC:$dsn", 'username', 'password') 

# Prepare your sql statement (perldoc DBI for much more info). 
my $sth = $dbh->prepare('select id, name from mytable'); 

# Execute the statement. 
if ($sth->execute) 
{ 
    # This will keep returning until you run out of rows. 
    while (my $row = $sth->fetchrow_hashref) 
    { 
     print "ID = $row->{id}, Name = $row->{name}\n"; 
    } 
} 

# Done. Close the connection. 
$dbh->disconnect; 
+1

Si vous utilisez une plate-forme Unix-ish, DBD :: ODBC risque d'être pénible, et il vaut probablement mieux utiliser DBD :: Sybase avec FreeTDS (Eh bien, UnixODBC a été assez douloureux la dernière fois que je l'ai essayé) – araqnid

+0

@araqnid - J'allais mentionner FreeTDS mais j'ai décidé d'éviter de compliquer cela. J'ai eu la joie d'UnixODBC moi-même :) –

2

Voici un exemple de base en utilisant DBI (modifié après un commentaire):

use DBI; 

my $dbh = DBI->connect("dbi:Sybase:database=<dbname>;server=<servername>", 
    <user>, <password>, 
    { PrintError => 0, RaiseError => 1 }); 
my $sth = $dbh->prepare("select field from table"); 
my $result = $sth->execute(); 
while(my $result = $sth->fetchrow_hashref) { 
    print $result->{field}; 
} 
$sth->finish; 
$dbh->disconnect; 

espoir de voir d'autres réponses avec une solution plus simple :)

+1

Vous ne généralement pas besoin de spécifier dbi_connect_method. Et je recommanderais d'utiliser "PrintError => 0, RaiseError => 1" pour que les erreurs SQL soient lancées ... d'autant plus que vous ne faites aucune vérification d'erreur;) Vous pouvez même raccourcir simplement en disant "pour mon $ row in (@ {$ dbh-> selectall_arrayref ("sélectionner un champ dans la table", {Slice => {}})}) {print "$ row -> {field} \ n";} Si vous êtes va utiliser fetchrow_hashref ou ses amis, vaut la peine de définir "FetchHashKeyName => 'NAME_lc'" lors de la connexion à la base de données aussi, certaines personnes insistent pour utiliser CamelCase pour les noms de colonnes Mais à part tout ça, très bien :) – araqnid

+0

Bonnes suggestions, – Andomar

0
 # 
     # ------------------------------------------------------ 
     # run a passed sql and retun a hash ref of hash refs 
     # ------------------------------------------------------ 
     sub doRunSqlGetHashRef { 

      my $self     = shift ; 
      my $sql     = shift ; 

      my $hsr_meta    = {} ; 
      my $hsr     = {} ; 
      my $rowid = 0 ; 
      my $flag_filled_hsr_meta = 0 ; 
      my $hsr_meta_colid   = 0 ; 

      use DBI; 

      my $dbs = "dbi:ODBC:DRIVER=FreeTDS;DSN=DEV_MSSQLSRV_DSN"; 
      # verify by : 
      # isql -v DEV_MSSQLSRV_DSN user pwd 

      my $dbh = DBI->connect($dbs, $db_user, $db_user_pw) 
       or die "CONNECT ERROR! :: $DBI::err $DBI::errstr $DBI::state $!\n"; 

      if (defined($dbh)) { 

       # Prepare your sql statement (perldoc DBI for much more info). 
       my $sth = $dbh->prepare($sql) ; 

       # Execute the statement. 
       if ($sth->execute) { 
       # This will keep returning until you run out of rows. 
        while (my $row = $sth->fetchrow_hashref) { 

         # fill in the meta hash reference with the col names 
         if ($flag_filled_hsr_meta == 0) { 
          for (@{$sth->{ 'NAME' }}) { 
           # debug ok print "$_ => $row->{$_}\t"; 
           $hsr_meta->{ $hsr_meta_colid } = $_ ; 
           $hsr_meta_colid++ ; 
           $flag_filled_hsr_meta = 1 ; 
          } 
         } 
         # p ($row) ; # row level debug ... 
         $hsr->{ $rowid } = $row ; 
         $rowid++ ; 
        } 
       } 
       # Done. Close the connection. 
       $dbh->disconnect; 

       # debug ok p($hsr_meta) ; 

       return ($hsr_meta , $hsr) ; 
      } 
      else { 
       print "Error connecting to database: Error $DBI::err - $DBI::errstr\n"; 
      } 

     } 
     #eof sub doRunSqlGetHashRef 
Questions connexes