[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