memo.garciasir has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I canīt make an update to a MS Access dabase using DBI.pm

The code i'm using is similar to the one that follows:

#!/usr/bin/perl use strict; use warnings; use Cwd; use DBI; my ($dsn, $dbh, $sth); my %proyeccionPIB; my $curDir = cwd(); my $dbName = $curDir . "/cargasInterurbanas.mdb"; $dsn = "dbi:ODBC:" . "DRIVER={Microsoft Access Driver (*.mdb)};" . "DBQ=" . $dbName . ";" . "PWD=;" ; $dbh = DBI-> connect($dsn, undef, undef, {PrintError => 1, RaiseError +=>1}) or die "Can't open database ($DBI::errstr)"; $dbh->{RaiseError} = 1; my $sql = "SELECT Ano, crecimientoPIB FROM PIB;"; $sth = $dbh->prepare ($sql); $sth->execute (); print "ProyeccionPIB\n"; while (my @row = $sth->fetchrow_array) { $proyeccionPIB{$row[0]} = $row[1]; printf ("\t%s\t%5.3f\n", $row[0], $proyeccionPIB{$row[0]}); } $sql = "UPDATE PIB SET crecimientoPIB = 0.045 WHERE Ano = 2013"; $sth = $dbh->prepare ($sql) or die->errstr;; $sth->execute (); DBI::dump_results($sth);

When I run this code, it tell that "0 rows" are updated

the definition of the PIB table is:

Ano type Number crecimientoPIB type number

If I do the same update directly into MS Access it works fine

What I'm doing wrong?

Thanks in advance,

memo

Replies are listed 'Best First'.
Re: update access dabase using DBI
by moritz (Cardinal) on Jan 31, 2011 at 20:30 UTC
    When I run this code, it tell that "0 rows" are updated

    And if you query the value that was changed, is it correct?

    That is, is only the count wrong, or does nothing happen?

    You should also be aware that errors can not only happen during prepare(), but also during executed() - setting the RaiseError => 1 option means you won't miss any error silently.

Re: update access dabase usin DBI
by Just in (Sexton) on Feb 01, 2011 at 05:23 UTC

    Doesn't AutoCommit need to be turned on?

    my $db = DBI->connect( "dbi:ODBC:$dsn_name", q{}, q{}, { RaiseError => 1, AutoCommit => 1 } ) or die $DBI::errstr;
Re: update access dabase usin DBI
by mje (Curate) on Feb 01, 2011 at 10:21 UTC

    In addition to the other comments you've got (which are all very good ones), check the return from the execute method as that tells you how many rows were updated. It may be 0E0 for true (execute worked) but no rows were updated.