Erro de ResultSet, não está posicionado corretamente, talvez você precise chamar next.

Java

18/06/2017

Estou com um problema de resultset assim como está citado acima. Estou desenvolvendo um sistema clinico em Java SE, para apresentação do meu tcc. Em um dos meus códigos estou tentando fazer um inner join entre tabelas, para pegar o código do paciente e retorna nos campos da tela para impressão. Mais não está retornando e fica dando esse erro, já conferi os nomes das tabelas e colunas e está tudo certo.
Desde já obrigado pela atenção, e aguardo respostas, quem puder me ajudar eu vou agradecer bastante.
Janailson

Janailson

Curtidas 0

Melhor post

Marcio Souza

Marcio Souza

18/06/2017

Posta o código do método que tem o resultset que está lançando o erro.
GOSTEI 1

Mais Respostas

Janailson

Janailson

18/06/2017

Boa noite.

public BeansAgenda buscarAgendaCodigo (int cod){
BeansAgenda agen = new BeansAgenda();

conectDB.conexao();
conectDB.executaSql("select *from agenda inner join pacientes on cod_pac_agenda=cod_paciente inner join medicos on cod_med_agenda=cod_medico where cod_agenda='"+cod+"'");
try {
conectDB.rs.first();
agen.setNomePacinte(conectDB.rs.getString("nome_paciente"));
agen.setNomeMedico(conectDB.rs.getString("nome_medico"));
agen.setObservacao(conectDB.rs.getString("observ_agenda"));
agen.setDtnascPaciente(conectDB.rs.getString("nascimento_paciente"));


} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro na busca do agendamento por codigo!"+ex);
}
return agen;

}


Esse é o codigo do metodo.
GOSTEI 0
Marcio Souza

Marcio Souza

18/06/2017

Janilson, porque você decidiu usar o método first() do seu resultSet? Deveria usar next(). Faça assim:
public BeansAgenda buscarAgendaCodigo (int cod){
	BeansAgenda agen = new BeansAgenda();

	conectDB.conexao();
	ResultSet rs = conectDB.executaSql("select *from agenda inner join pacientes on cod_pac_agenda=cod_paciente inner join medicos on cod_med_agenda=cod_medico where cod_agenda='"+cod+"'");
	try {
	
		if (rs.next()) {
			agen.setNomePacinte(rs.getString("nome_paciente"));
			agen.setNomeMedico(rs.getString("nome_medico"));
			agen.setObservacao(rs.getString("observ_agenda"));
			agen.setDtnascPaciente(rs.getString("nascimento_paciente"));
		}

	} catch (SQLException ex) {
		JOptionPane.showMessageDialog(null, "Erro na busca do agendamento por codigo!"+ex);
	}
	return agen;
}

Uma dica. Se está usando Statement substitua por PreparedStatement que evita o SQLInjecton.
GOSTEI 0
Janailson

Janailson

18/06/2017

Boa tarde Ballem, desde já obrigado pela ajuda mais vou te alugar um pouco mais.


public class ConexaoBanco {
public Statement stm; // Prepara e realiza as pesquisas
public ResultSet rs; // Guarda as pesquisas realizadas
private String driver = "org.postgresql.Driver"; // Driver padrão do Postgresql
private String caminho = "jdbc:postgresql://localhost:5432/softclinic"; // Caminho de localização, porta e nome do BD
private String usuario = "postgres"; // Usuário padrão postgres
private String senha = "admin"; // Senha de acesso ao Banco
public Connection conDB; // Variavel de conexão

public void conexao(){ // Metodo de conexão com o banco de dados
try {
System.setProperty("jdbc.Drivers", driver);
conDB=DriverManager.getConnection(caminho, usuario, senha);
//JOptionPane.showMessageDialog(null, "A conexão com o Banco de Dados foi realizda!!");
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Não foi possível efetuar a conexão:\\n"+ex.getMessage());
}
}

public void executaSql(String sql){
try {
stm = conDB.createStatement(rs.TYPE_SCROLL_INSENSITIVE,rs.CONCUR_READ_ONLY);
rs = stm.executeQuery(sql);
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro na execução do Sql:\\n"+ex.getMessage());
}
}

public void desconecta(){ // Metodo de incerramento de conexão com o banco de dados
try {
conDB.close();
//JOptionPane.showMessageDialog(null,"Sua conexão com o Banco de Dados foi finalizada com Sucesso");
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Não foi possível finalizar sua conexão:\\n"+ex.getMessage());
}
}


Esse é o meu arquivo de conexão como seria, apenas trocar de metodo?
GOSTEI 0
Marcio Souza

Marcio Souza

18/06/2017

No seu método executaSql() teria as seguintes mudanças:
	public void executaSql(String sql, Object... params) {//params recebe os parametros da consulta
	    try {
			pstm = conDB.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			for (int i = 0; i < params.length; i++) {
                                pstm.setObject(i+1, params[i]); //adiciona os paramentros no pstm
                        }
			rs = pstm.executeQuery();
	    } catch (SQLException ex) {
	        	JOptionPane.showMessageDialog(null, "Erro na execução do Sql:\\\\n"+ex.getMessage());
	    }
	}


E no código que chama o executaSql():
conectDB.executaSql("select * from agenda inner join pacientes on cod_pac_agenda = cod_paciente inner join medicos on cod_med_agenda = cod_medico where cod_agenda = ?", cod);

Os parametros da consulta devem agora ser substituídos por um ponto de interrogação. Depois, coloque o paramentro como um argumento do método executaSql(). Se tiver mais paramentros em outra consulta, basta separa-los por virgula, obedecendo a ordem deles dentro da consulta, exemplo:
executaSql("select * from Pessoas where nome = ? and idade = ?", nome, idade)
GOSTEI 0
Janailson

Janailson

18/06/2017

Bom dia. Aquele primeiro código que você editou do ResultSet e mandou pra mim.
Ele tá dando um erro de "incompatible types void cannot be converted to ResultSet"
GOSTEI 0
Marcio Souza

Marcio Souza

18/06/2017

Em qual linha está ocorrendo o erro, pode postar?
GOSTEI 0
Janailson

Janailson

18/06/2017

Boa tarde, desculpe a demora na postagem é que tava correndo com a parte teorica também do projeto.

ResultSet rs = conectDB.executaSql("select *from agenda inner join pacientes on cod_pac_agenda=cod_paciente inner join medicos on cod_med_agenda=cod_medico where cod_agenda='"+cod+"'");


É nessa parte do codigo que fica dando incompatibilidade
GOSTEI 0
Marcio Souza

Marcio Souza

18/06/2017

Bem, então deve ser porque o método executaSql que não retorna um ResultSet.
GOSTEI 0
POSTAR