Recuperar campos atraves de ColumnLabel

quando executo o código que chama o método totalDeRespostas obtenho um column not found exception. Alguém pode me ajudar a dizer o pq?

[code]
public class DaoResultados {

private Connection c = null;

public DaoResultados() throws SQLException
{
    this.c = new ConnectionMoodle().conectaAoBanco();
}

public String totalDeRespostas() throws SQLException
{
    String sql = "select count(resp_camp_1a) from mdl_dev_tb_quest_entrada_pag2";
    PreparedStatement stm = this.c.prepareStatement(sql);
    ResultSet rs = stm.executeQuery();
    String resp = "";
    while(rs.next())
    {
      resp = rs.getString("resp_camp_1a");
      /*
      resp = rs.getString(1); caso o codigo fique assim ele exibe o resultado normal. colocando o nome da coluna 
       * não funciona.
       */
    }
    return "Total de resultados : " + resp;
}

}[/code]

Erro.:


java.sql.SQLException: Column 'resp_camp_1a' not found.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
        at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1145)
        at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5617)
        at dao.moodle.DaoResultados.totalDeRespostas(DaoResultados.java:30)
        at controller.formularios.Resultado.main(Resultado.java:16)

Marcio,

Na sua query é necessário informar um alias para a coluna. Veja abaixo:

String sql = “select count(resp_camp_1a) as resp_camp_1a from mdl_dev_tb_quest_entrada_pag2”;

Se vc não especificar um alias é provável que o nome resultante da sua coluna será count(resp_camp_1a)

E assim, vc precisaria recuperar como abaixo:

resp = rs.getString(“count(resp_camp_1a)”);

@braços

[quote=ccllss]Marcio,

Na sua query é necessário informar um alias para a coluna. Veja abaixo:

String sql = “select count(resp_camp_1a) as resp_camp_1a from mdl_dev_tb_quest_entrada_pag2”;

Se vc não especificar um alias é provável que o nome resultante da sua coluna será count(resp_camp_1a)

E assim, vc precisaria recuperar como abaixo:

resp = rs.getString(“count(resp_camp_1a)”);

@braços[/quote]

valeu amigoo… realmente resolveu o problema! agora será que você poderia me ajudar a encontrar o erro nesse outro código.:

[code]
public String[] exibirCamposDaTabela() throws SQLException
{
String sql = “select * from mdl_dev_tb_quest_entrada_pag2”;
PreparedStatement stm = this.c.prepareStatement(sql);
ResultSet rs = stm.executeQuery();
ResultSetMetaData md = rs.getMetaData();
campos = new String[md.getColumnCount()];

    for(int i = 3; i < md.getColumnCount(); i++)
    {
        campos[i] = md.getColumnName(i);
    }
    rs.close();
    stm.close();
    return campos;
}

public String exibirAsRespostas() throws SQLException
{
    String resp = "";
    for(int i = 0; i < exibirCamposDaTabela().length; i++)
    {
        String sql = "select count("+exibirCamposDaTabela()[i]+") as "+exibirCamposDaTabela()[i]+" from mdl_dev_tb_quest_entrada_pag2";
        PreparedStatement stm = this.c.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();
        while (rs.next())
        {
            resp += rs.getString(exibirCamposDaTabela()[i]);
        }
    }
    return resp;
}[/code]

eu recebo este erro, apesar de não ver erros no retorno desse método…

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'null from mdl_dev_tb_quest_entrada_pag2' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264) at dao.moodle.DaoResultados.exibirAsRespostas(DaoResultados.java:59) at controller.formularios.Resultado.main(Resultado.java:18)

Marcio,

Brother… Esses seus métodos estão bem estranhos… Permita-me algumas observações.

1 - Porque vc faz três chamadas ao método exibirCamposDaTabela() ? Não seria melhor vc executar somente uma vez fora do “for” e armazenar numa variável e depois recuperar conforme vc deseja. Assim como vc fez, se a tabela contiver 10 campos, vc vai chamar 30 vezes esse método, ou seja, 30 vezes vc irá consultar a base, se a quantidade de registros for grande a performance vai ser horrível, porque não tem nenhuma cláusula “WHERE” na consulta.

Ex.:


public String exibirAsRespostas() throws SQLException   
    {   
        String resp = "";   
        String campos[] = exibirCamposDaTabela();
        for(int i = 0; i < campos.length; i++)   
        {   
            String campo = campos[i];
            String sql = "select count(" + campo + ") as " + campo + " from mdl_dev_tb_quest_entrada_pag2";   
            PreparedStatement stm = this.c.prepareStatement(sql);   
            ResultSet rs = stm.executeQuery();   
            while (rs.next())   
            {   
                resp += rs.getString(campo);   
            }   
        }   
        return resp;   
    }

2 - Porque vc concatena o resultado da consulta numa variável resp do tipo String, se o resultado dessa query sempre será um único registro com o valor total de registros?

3 - Se vc notar o resultado sempre será o mesmo para todos os campos, pois vc não especificou cláusula a “WHERE” em sua consulta.

A propósito para vc ter uma idéia do que está acontecendo, mande imprimir a sql resultante e analise para ver se existe algum problema nela. Adicione esta linha depois da linha 23:

String sql = "select count("+exibirCamposDaTabela()[i]+") as "+exibirCamposDaTabela()[i]+" from mdl_dev_tb_quest_entrada_pag2";   
System.out.println("Query ==> " + sql);

@braços

[quote=ccllss]Marcio,

Brother… Esses seus métodos estão bem estranhos… Permita-me algumas observações.

1 - Porque vc faz três chamadas ao método exibirCamposDaTabela() ? Não seria melhor vc executar somente uma vez fora do “for” e armazenar numa variável e depois recuperar conforme vc deseja. Assim como vc fez, se a tabela contiver 10 campos, vc vai chamar 30 vezes esse método, ou seja, 30 vezes vc irá consultar a base, se a quantidade de registros for grande a performance vai ser horrível, porque não tem nenhuma cláusula “WHERE” na consulta.

Ex.:


public String exibirAsRespostas() throws SQLException   
    {   
        String resp = "";   
        String campos[] = exibirCamposDaTabela();
        for(int i = 0; i < campos.length; i++)   
        {   
            String campo = campos[i];
            String sql = "select count(" + campo + ") as " + campo + " from mdl_dev_tb_quest_entrada_pag2";   
            PreparedStatement stm = this.c.prepareStatement(sql);   
            ResultSet rs = stm.executeQuery();   
            while (rs.next())   
            {   
                resp += rs.getString(campo);   
            }   
        }   
        return resp;   
    }

2 - Porque vc concatena o resultado da consulta numa variável resp do tipo String, se o resultado dessa query sempre será um único registro com o valor total de registros?

3 - Se vc notar o resultado sempre será o mesmo para todos os campos, pois vc não especificou cláusula a “WHERE” em sua consulta.

A propósito para vc ter uma idéia do que está acontecendo, mande imprimir a sql resultante e analise para ver se existe algum problema nela. Adicione esta linha depois da linha 23:

String sql = "select count("+exibirCamposDaTabela()[i]+") as "+exibirCamposDaTabela()[i]+" from mdl_dev_tb_quest_entrada_pag2";   
System.out.println("Query ==> " + sql);

@braços[/quote]

Realmente cara… eu não tinha me tocado… foi um pouco de falta de atenção também… acontece que esses dados eles sao dados numéricos ai eu tenho que fazer uma pesquisa em cima deles pra poder gerar um relatório pro local onde trabalho… realmente eu nao tinha prestado atenção que sempre ia dar o mesmo resultado pra todos os campos… mas agora já corrigi o código… a questao de dar null pointer expection é pq eu estava tentando omitir os tres primeiros campos da pesquisa… mas ele parece não aceitar… observa novamente…

[code] public void pegarCamposDaTabela() throws SQLException {
String sql = “select * from mdl_dev_tb_quest_entrada_pag2”;
PreparedStatement stm = c.prepareStatement(sql);
ResultSet rs = stm.executeQuery();
ResultSetMetaData md = rs.getMetaData();
campos = new String[md.getColumnCount()];
for (int i = 1; i < md.getColumnCount(); i++) {
campos[i] = md.getColumnLabel(i);
}
rs.close();
stm.close();

}

public String listarAsRespostasPorCampo() throws SQLException {
    pegarCamposDaTabela(); // chama o metodo para popular o vetor
    String resp = "";
    for (int i = 3; i < campos.length; i++) {
        if (!campos[i].equals(null)) {
            String sql = "select count(" + campos[i] + ") as " + campos[i] + " from mdl_dev_tb_quest_entrada_pag2";
            System.out.println("Query ==> " + sql);
            PreparedStatement stm = this.c.prepareStatement(sql);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                resp += rs.getString(campos[i]) + "\n";
            }
        } else {
            i++;
            
        }

    }
    return resp;
}[/code]