2009-05-22 2 views

ответ

4

Вам нужно будет использовать DBI, и вы, вероятно, лучше с помощью поставщик DBD :: ODBC от (CPAN). Если вы не знаете о DBI, вам нужно прочитать об этом. Есть книга (Programming the Perl DBI), которая старая, но все еще действительная.

Тогда что-то вроде следующего:

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

Если вы на платформе Unix-ish, DBD :: ODBC, скорее всего, будет больно, и, вероятно, лучше использовать DBD :: Sybase с FreeTDS. (Ну, UnixODBC был очень болезненным в прошлый раз, когда я попробовал) – araqnid

+0

@araqnid - Я собирался упомянуть FreeTDS, но решил не усложнять это. У меня была радость самого UnixODBC :) –

2

Вот простой пример использования DBI (отредактировано после комментария):

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; 

Надеясь, чтобы увидеть другие ответы с более простым решением :)

+1

Вам вообще не нужно указывать dbi_connect_method. И я бы рекомендовал использовать «PrintError => 0, RaiseError => 1», чтобы возникли ошибки SQL ... тем более, что вы не делаете никаких проверок ошибок;) Вы можете даже сократить, просто сказав: «для моего $ row in (@ {$ dbh-> selectall_arrayref ("select field from table", {Slice => {}})}) {print "$ row -> {field} \ n";} Если вы собирается использовать fetchrow_hashref или его друзей, стоит установить «FetchHashKeyName =>« NAME_lc »при подключении к БД тоже, некоторые люди настаивают на использовании CamelCase для имен столбцов. Но кроме всего этого, штраф :) – araqnid

+0

Хорошие предложения, отредактировано – 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