PreparedStatement não funciona para Select?

4 respostas
JoaoBluSCBR

Li vários tópicos sobre PreparedStatement, quase todo mundo dá o mesmo exemplo, um insert.

Mas tentei com select, de vários jeitos e não funciona.

O código abaixo não funciona. Quando vc tenta listar (dentro do while),
diz que nome de coluna invalido. Ou seja, ele faz o select usando aqueles nomes que estao nos argumentos,
não dá erro, mas na hora de mostrar diz que o mesmo nome de coluna nao é valido.

Já se eu fizer tudo fixo, usando PreparedStatement mas não incluindo nenhum ? ele passa e mostra
as colunas também. É como se a montagem não funcionasse para Select.

public ResultSet select() throws SQLException {

        String args[] = { "CODIGO", "NOME", "SALARIO" };
  
        try {
            
            con = new ConnectionFactory().getConnection(dbType);
            
            stmt = con.prepareStatement("SELECT ?, ?, ? FROM MEDICOS");

            // preenche os valores   
            stmt.setString(1, args[0]);
            stmt.setString(2, args[1]);
            stmt.setString(3, args[2]);

            // executa   
            rs = stmt.executeQuery();
            
            while(rs.next()){
                System.out.println(rs.getInt(args[0]) + " - " + rs.getString(args[1]) + " - " + rs.getFloat(args[2]));
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            con.close();
            stmt.close();
        }
        
        return rs;
    }

4 Respostas

henriqueluz

Não entendi qual o sentido de usar PreparedStatement no nome das colunas. Eu nunca tinha visto nada desse tipo e nem sei se funciona.
Por que você quer usar desta maneira?
Abs,

E

O nome das colunas não pode ser parametrizado em um PreparedStatement. Ele é usado, por exemplo, na cláusula WHERE.

B

use JPA com algum ORM

aí resolve né

T

Cara, não é recomendado fazer isso. É desnecessário e dificulta. Imagine se sua query fosse algo assim:

SELECT DISTINCT FF_MATRICULA,FF_MES , FF_ANO,(ff_TIPO || FF_CODIGO) ff, RDR_DESCRICAO,FF_QUANT, FF_VALOR, "
                    CASE  "
                         WHEN FF_MES = SUBSTR(DIGITS(MONTH(EMP_ADMISSAO)),9,2) and FF_ANO = SUBSTR(DIGITS(YEAR(EMP_ADMISSAO)),7,4) THEN SUBSTR(DIGITS(DAY(EMP_ADMISSAO)),9,2)  
                         ELSE '01' END, FF_BASE  
                     FROM FOL.FICHA_Y INNER JOIN folha.cad_empregadoB_2y ON FF_MATRICULA=EMP_MATRICULA, FOL.TAB_REMDES  "
                    WHERE FF_TIPO = RDR_TIPO AND FF_CODIGO = RDR_CODIGO AND FF_MES <> '13' AND  "
                    FF_ANO || FF_MES >= '201101' AND FF_ANO || FF_MES <= '201105' AND ff_matricula = 'ert5467' and  
                    FF_TIPO || FF_CODIGO IN  
                    ('1001','1002','1003','1006','1007','1008','1010','1011','1013','1014','1017','1022','1024','1058','1060','1061', 
                    '1064','1065','1066','1068','1069','1070','1071','1074','1075','1076','1078','1079','1080','1082','1084','1086', 
                    '1100','1101','1102','1103','1104','1106','1107','1108','1109','1110','1111','1112','1120','1121','1123','1127', 
                    '1128','1129','1132','1133','1134','1135','1136','1142','1146','1202','1272','1300','1301','1302','1303','1304', 
                    '1306','1307','1308','1309','1320','1321','1322','1323','1324','1325','1328','1331','1334','1335','1337','1339', 
                    '1341','1342','1345','1346','1351','1357','1358','1361','1364','1366','1367','1368','1369','1372','1376','1378', 
                    '1381','1391','1392','1400','1402','1403','1404','1405','1505','1545','1605','1609','1610','1613','1614','1617', 
                    '1618','1629','2023','2024','2029','2032','2035','2036','2037','2040','2041','2042','2044','2061','2070','2080', 
                    '2087','2088','2093','2102','2103','2107','2110','2113','2115','2116','2117','2121','2125','2126','2127','2128', 
                    '2202','2210','2211','2301','2302','2308','2326','2328','2331','2341','2350','2351','2352','2353','2403','2405', 
                    '2409','2411','2413','2414','2415','2416','2418','2422','2423','2424','2425','2504','2510','2512','2525','2526', 
                    '2539','2540','2543','2544','2546','2548','2549','2553','2554','2555','2568','2577','2592','2597','2598','2600', 
                    '2608','2615','2617','2634','2637','2638','2639','2401','2402','3001','2401','2402','3001')   
                    ORDER BY FF_MATRICULA, FF_ANO, FF_MES, ff ;

Como ficaria utilizando PrepareStatement? Acredite, essa query não é uma exceção.

Abraço

Criado 8 de agosto de 2011
Ultima resposta 9 de ago. de 2011
Respostas 4
Participantes 5