[Cascavel-pm] DBD::ODBC, escape sequences e placeholders

Alceu R. de Freitas Jr. glasswalk3r em yahoo.com.br
Quinta Novembro 26 14:45:12 PST 2009


--- Em qui, 26/11/09, Eden Cardim <edencardim em gmail.com> escreveu:

> De: Eden Cardim <edencardim em gmail.com>
> Assunto: Re: [Cascavel-pm] DBD::ODBC, escape sequences e placeholders
> Para: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
> Data: Quinta-feira, 26 de Novembro de 2009, 8:40
> >>>>> "Alceu" == Alceu
> R de Freitas <glasswalk3r em yahoo.com.br>
> writes:
>     Alceu> DBD::ODBC::st execute failed:
> [Microsoft][ODBC SQL Server
>     Alceu> Driver][SQL Server]Syntax error
> converting datetime from
>     Alceu> character string. (SQL-22007)
> [state was 22007 now 42000]
>     Alceu> [Microsoft][ODBC SQL Server
> Driver][SQL Server]Statement(s)
>     Alceu> could not be prepared. (SQL-42000)
> 
>     Alceu> Qual a forma correta de usar essa
> funcionalidade junto com um
>     Alceu> placeholder?
> 
> O problema está na string que você está passando e não
> no uso do
> placeholder. Mostre o código que está populando os
> placeholders e
> preparando o statement.
>     

Olá Eden,

Vou passar parte do código apenas por desencargo. Eu já fiz vários testes, mas o erro obtido ocorre mesmo passando valores undef. A documentação orienta a passar datas no formato AAAA-MM-DD, mas mesmo assim não funciona.

Esses dados são passados via um form (o campo é aberto para edição):

<code>
    my @params_names = $query->param;
    @params_names = sort(@params_names);

    my %project;

    foreach my $param (@params_names) {

        if ( $param =~ /^proj_/ ) {

            my $temp = $query->param($param);

            my $key = ( split( /_/, $param ) )[1];

            if ( ( $temp eq '' ) or ( $temp =~ /^\s+$/ ) ) {

                $temp = undef;

            }
            else {

                $temp =~ s/\s+$//;

            }

            $project{$key} = $temp;
            next;

        }

    if ( exists( $project{id} ) ) {

        $proj_ret = $DAO->update_project( \%project );

    }

# no código referente a $DAO

sub update_project {

    my $self = shift;

    # hash ref
    my $project = shift;

    my $query = q(
	UPDATE t_pm_projeto
SET    nom_projeto               = ?,
       data_criacao              = { d ? },
       data_atualizacao          = { d ? },
       cod_status                = ?,
       nom_produto               = ?,
       num_pacientepotencialmes  = ?,
       num_pacientemesatual      = ?,
       nom_setor                 = ?
WHERE  cod_projeto               = ?
);

    $self->{sth_upd_proj} = $self->{dbh}->prepare($query);

    $self->{sth_upd_proj}->bind_param( 1, $project->{name} );
    $self->{sth_upd_proj}->bind_param( 2, $project->{creation} );
    $self->{sth_upd_proj}->bind_param( 3, $project->{update} );
    $self->{sth_upd_proj}->bind_param( 4, $project->{status} );
    $self->{sth_upd_proj}->bind_param( 5, $project->{product} );
    $self->{sth_upd_proj}->bind_param( 6, $project->{patientsPotential} );
    $self->{sth_upd_proj}->bind_param( 7, $project->{patientsTotal} );
    $self->{sth_upd_proj}->bind_param( 8, $project->{sector} );
    $self->{sth_upd_proj}->bind_param( 9, $project->{id} );

    my $ret = $self->{sth_upd_proj}->execute();

    $self->{sth_upd_proj}->finish();

    return $ret;

}
</code>

Agora se eu montar a query desta forma (usando valores hardcoded):

UPDATE t_pm_projeto
SET    nom_projeto               = ?,
       data_criacao              = { d '2008-01-15' },
       data_atualizacao          = { d '2009-22-11' },
       cod_status                = ?,
       nom_produto               = ?,
       num_pacientepotencialmes  = ?,
       num_pacientemesatual      = ?,
       nom_setor                 = ?
WHERE  cod_projeto               = ?

aí os dados são atualizados corretamente.

Obrigado pela ajuda.

Abraços,
Alceu


      ____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com


Mais detalhes sobre a lista de discussão Cascavel-pm