Problemas com ResultSet

14 respostas
C

Galera,

Executei um select e para ver se achou registro, usei rs.next, que me retorna false; porém, qdo executo o mesmo select no shell, me mostra varios registros.

Alguém tem alguma idéia de como resolver isso?

14 Respostas

Tomassoni

Posta o código ai, pra gente ver?

wmalheiros

kra posta seu código aí para eu dar uma olhada e tentar te ajudar.

flw

von.juliano

Verifique se a forma como vc faz conexão ao banco está correta. Se estiver, imprima sua query no prompt, pra ver se ela está correta.
Há grandes possibilidades de erro se vc estiver fazendo algo como:

"SELECT * FROM usuarios WHERE nome = " + nome;

Falow! :thumbup:

Abdon

Ou os filtros, ou o select, ou o banco esta diferente do teste que vc esta fazendo em shell

Ou sei lá, seu select é:

"SELECT * FROM usuarios WHERE nome = " + nome;

Eu normalmente uso PreperedStatement mas tenta escreve-lo assim:

String query = "SELECT * FROM usuarios WHERE nome = "' + nome + "'" 

que vai equivaler ao comando

Select * from usuarios where nome = 'Abdon';

Abdon é uma constante neste caso e precisa ser tratada como tal. Mas eu não sei se é este o seu problema, eu acho que escrevendo a query como vc fez

"SELECT * FROM usuarios WHERE nome = " + nome;

da erro de execução da query

erickcellani
boolean isNoCode = false;

if(!isNoCode) {
   System.out.println("Sem respostas amigo!");
}
von.juliano

Na verdade, o código que nosso amigo passou acima não é uma boa opção. :thumbdown: Eu citei antes que

String query = "SELECT * FROM usuarios WHERE nome = " + nome;

está muito sujeito à erros e repare que

String query = "SELECT * FROM usuarios WHERE nome = "' + nome + "'"

não está longe do que foi citado. Eu esqueci de passar a forma correta:

String query = "SELECT * FROM usuarios WHERE nome = ?" Connection connection = ConnectionFactory.getConnection(); PreparedStatement stmt = connection.prepareStatement(query); [b]stmt.setString(1, codigo);[/b] ResultSet rs = stmt.executeQuery();
A utilização do método setString é a forma correta para esses casos. Dê uma pesquisada nos métodos de PreparedStatement.

Flw! :thumbup:

Tomassoni

Não seria legal colocar o PreparedStatement para ele ver ?
Assim a concatenação das aspas simples não é necessario com o PreparedStatement.

Vou fazer um exemplo simples com e sem PreparedStatement, so para ilustar.

Sem:

public void semPreparedStatement(String pNome){
       Statement stmt = null;
       ResultSet rset = null;
       SQL = "select * from usuario where nome = " + "' + pNome + '";
        try {
            stmt = conn.prepareStatement(SQL);
            rset = stmt.executeQuery();
            if(rset.next()){
                return rset;
            }
        } finally {
            
            if (stmt != null)
                try {
                    stmt.close();
                } catch(Exception e) {
                }
            if (conn!= null)
                try {
                    conn.close();
                } catch(Exception e) {
                }
        }
        
    }
}

Com

public void comPreparedStatement(String pNome){
        PreparedStatement pstm = null;
        ResultSet rset = null;
SQL = "select * from usuario where nome = ?";
        try {
            pstm = conn.prepareStatement(SQL);
            pstm.setString(1, pNome); // se tivesse dois ? o proximo seria  pstm.setString(2, segundo) e assim por diante note o tipo "setString"
            rset = pstm.executeQuery();
            if(rset.next()){
                return rset;
            }
        } finally {
            
            if (stmt != null)
                try {
                    stmt.close();
                } catch(Exception e) {
                }
            if (conn!= null)
                try {
                    conn.close();
                } catch(Exception e) {
                }
        }
       
    }
}

}

Bom fiz as pressas, espero que ajude, se algo tiver errado sintam-se a vontade para opniar e alterar.

C

esse é a parte q interessa… (só pra não poluir…)

String cpf = replacex(JFcpf.getText(),"-","",".",""); String query = "select FATURA,PARCELAS,DATA_VCTO,VAL_PARCELA,DATA_COMPRA from "+tabelaFatura+ " where DATA_PTO = '0000-00-00' and CPF ='"+cpf+"'"; try{ rs = st.executeQuery(query); if (!rs.next()){ (..)

eu mandei imprimir no console do netbeans a query e está certinho…

C

qto a conexão, eu acredito q estah ok, pq faço um select em outra tabela nesta mesma classe e funga blz…

von.juliano

Tente assim:

String cpf = replacex(JFcpf.getText(),"-","",".","");
String query = "select FATURA, PARCELAS, DATA_VCTO, VAL_PARCELA, "+
"DATA_COMPRA from ? where DATA_PTO = '0000-00-00' and CPF =?";
	try{
		st.setString(1, nomeTabela);
		st.setString(2, cpf);
		rs = st.executeQuery(query);
		if (!rs.next()){
			(...)
erickcellani

cst:
esse é a parte q interessa… (só pra não poluir…)

String cpf = replacex(JFcpf.getText(),"-","",".",""); String query = "select FATURA,PARCELAS,DATA_VCTO,VAL_PARCELA,DATA_COMPRA from "+tabelaFatura+ " where DATA_PTO = '0000-00-00' and CPF ='"+cpf+"'"; try{ rs = st.executeQuery(query); if (!rs.next()){ (..)

eu mandei imprimir no console do netbeans a query e está certinho…

String cpf = replacex(JFcpf.getText(),"-","",".",""); String query = "select FATURA,PARCELAS,DATA_VCTO,VAL_PARCELA,DATA_COMPRA from "+tabelaFatura+ " where DATA_PTO = '0000-00-00' and CPF ='"+cpf+"'"; try{ rs = st.executeQuery(query); if (rs.next()){//vc tem que fazer se tiver next! (..)

siga o conselho dos amigos acima usando “?” na sua query…
mais seguro!..

C

no prompt, sai a query certa:

private void pesquisar() { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); JIparcelas.setVisible(true); String cpf = replacex(JFcpf.getText(),"-","",".",""); String query = "select FATURA,PARCELAS,DATA_VCTO,VAL_PARCELA,DATA_COMPRA from "+tabelaFatura+ " where DATA_PTO = '0000-00-00' and CPF ='"+cpf+"'"; try{ rs = st.executeQuery(query); if (!rs.next()){ sst("Este cliente não tem parcelas em aberto."); //prepara a tela para entrada de outro cliente JFcpf.setEditable(true); JFcpf.requestFocus(); JBparcelasAbertas.setEnabled(false); }else{ sst("Pesquisando parcelas abertas do cliente..."); rs.beforeFirst(); //variavel que armazena linha da tabela int lin = 0; while (rs.next()){ (...)

???

von.juliano

Acho que achei o problema. Tente assim:

private void pesquisar() {
	(...)
	Connection con = null;
	PreparedStatement stmt = null; // ATENÇÃO: Use PreparedStatement  ao invés de Statement
	ResultSet rs = null;
	
	String query = "select FATURA, PARCELAS, DATA_VCTO, VAL_PARCELA, " + 
		" DATA_COMPRA from ? where DATA_PTO = '0000-00-00' and CPF =?";
	try {
		con = ConnectionFactory.getConnection();
		stmt = con.prepareStatement(query); // ATENÇÃO!!!
		
		stmt.setString(1, tabelaFatura);
		stmt.setString(2, cpf)
		
		rs = stmt.executeQuery();

	(...)

Pode ser que vc não tenha postado, mas acho que o segundo “ATENÇÃO” está faltando não é? Vê se funciona agora!

ph_ms

nada do tipo?

rs.first();

antes do rs.next()??

Criado 15 de maio de 2007
Ultima resposta 15 de mai. de 2007
Respostas 14
Participantes 7