PreparedStatement e toString()

2 respostas
Ismaels

Olá pessoal,

Estou com problemas ao usar o método toString() do PreparedStatement. Eu crio o PreparedStatement e uso setInt e setString para passar os devidos valores e antes de executar, eu pego o SQL com PreparedStatement.toString().
No caso das Strings, não estão sendo adicionadas as aspas pelo PreparedStatement, e isso causa um erro na query (quando executada por fora). No entanto se eu executar usando o PreparedStatement tudo funciona, ou seja, as aspas são colocadas.
Aguém já viu isso?! Estou usando o PostgreSQL 8.2.
Agradeço já a atenção de todos =D

Ismael Stahelin

2 Respostas

A

Coloca explicitamente, com o post é assim nessa versão.

Sami_Koivu

Olá,

Eu acredito que o contrato do PreparedStatement não diz que o retorno do método toString() tem que ser um SQL válido. Porque é que você quer executar o SQL por fora do PreparedStatement?

Veja só a descrição do método Connection.prepareStatement:

A SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

Note: This method is optimized for handling parametric SQL statements that benefit from precompilation. If the driver supports precompilation, the method prepareStatement will send the statement to the database for precompilation. Some drivers may not support precompilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLException objects.

Eu não conheço o PostGreSQL intimamente, mas o Oracle por exemplo, o driver nunca constroi um SQL do jeito que você está pensando. Quando você faz um

PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM pessoa WHERE fulano=?");
pstmt.setString(1, "Sami");
pstmt.executeQuery();

O driver não cria um “SELECT * FROM pessoa WHERE fulano=‘Sami’”. Ele primeiro manda o “SELECT * FROM pessoa WHERE fulano=?” para o banco e depois quando você executa o .executeQuery, ele só diz pro banco que ele quer utilizar o valor “Sami” no lugar do ?.

Então acho que se o driver do PostGreSQL mostra o SQL mais ou menos dando um toString() já é muito. Mesmo se ele colocasse as aspas, você teria a bagunça toda de tratar os variaveis caso eles contem aspas simples, quebra de linha, etc, para que o SQL virasse válido. O PreparedStatement faz tudo isso para você.

[]s,
Sami

Criado 16 de novembro de 2007
Ultima resposta 16 de nov. de 2007
Respostas 2
Participantes 3