Dúvida JComboBox

Boa tarde pessoal,

Sou iniciante em Java e estou tentando criar um JComboBox e vinculá-lo ao uma lista obtida por meio de uma consulta em uma tabela de um banco de dados Access. Para isso estou utilizando um vetor como segue no código abaixo


Vector<String> vetor = new Vector<String>();
ConexaoBdNova	.getConexao();
ConexaoBdNova.setRs("select distinct responsavel from tblResponsavel");
ConexaoBdNova.rs.next();
while (ConexaoBdNova.rs.next()) {
      vetor.addElement(ConexaoBdNova.rs.getString(1));
			
}
JComboBox cboEquipe = new JComboBox(vetor);
cboEquipe.setFont(new Font("Arial", Font.PLAIN, 14));
cboEquipe.setBounds(62, 233, 167, 20);
contentPane.add(cboEquipe);

Ao debugar o código a rotina do while funciona direitinho, inclusive os na aba de variáveis do eclipse vejo que os elementos estão sendo adicionados no vetor, so que depois do último registro da lista é adicionado no vetor a rotina cai no while e, ao invés de sair do loop, ele tenta adicionar um novo elemento no vetor e ocorre um SQLException("[Microsoft][ODBC Driver Manager] Estado de cursor inválido"). Acredito que o programa cai na Exception pq ele tenta adicionar um elemento no vetor e o resultset “esta no fim”, mas se eu estiver certo por que a rotina não saiu do loop já que o resultado do rs.next() é falso? Ou será que errei em alguma coisa e não estou conseguindo enxergar?

Espero que alguém possa me dar uma luz…

Valeu…

ConexaoBdNova.rs.next();  
while (ConexaoBdNova.rs.next()) {  
      vetor.addElement(ConexaoBdNova.rs.getString(1));  
              
}

Pergunta - por que é que você dá um rs.next() antes do while ? É para desconsiderar a primeira linha do select?

[quote=entanglement][code]
ConexaoBdNova.rs.next();
while (ConexaoBdNova.rs.next()) {
vetor.addElement(ConexaoBdNova.rs.getString(1));

}
[/code]

Pergunta - por que é que você dá um rs.next() antes do while ? É para desconsiderar a primeira linha do select?
[/quote]

Adicionei essa linha para o resultset apontar para o primeiro registro, pois pelo que me falaram que eu preciso fazer isso para que o ponteiro aponte para o primeiro registro do resultset, a fim de evitar o “Estado de Cursor Inválido”. Fico na duvida se, no caso de usar o while para varrer o resultset, esta linha é desnecessária…

Nesse caso, é desnecessária.

Um duvida;

Se colocar

while (ConexaoBdNova.rs.next()!= null) { vetor.addElement(ConexaoBdNova.rs.getString(1)); }

Enquanto for diferente de nulo, faça;

Eu só não lembro se você joga esse resultado em alguma variavel para comparar ou consegue fazer direto;

Caso precise adicionar a uma variavel:

while ((variavel=ConexaoBdNova.rs.next())!= null) { vetor.addElement(ConexaoBdNova.rs.getString(1)); }

Também não tenho certeza, mas acho que assim da certo

while (!ConexaoBdNova.rs.next()) { vetor.addElement(ConexaoBdNova.rs.getString(1)); }

Bom, faça o teste e me diga xD

Cara. Use outro banco de dados(Postgres, JavaDB, MySql). Este banco de dados é muito lento. Provavelmente este é o motivo do erro. Se quiser usar este banco terá que colocar um Sleep() dentro do while.

Mario tentei utilizar a sua sugestão mas o operador != é invalido para tipos booleanos

Falei com um colega meu e ele me sugeriu alterar a construção do meu statement da classe de conexão de banco de dados, já que os parâmetros de tipo de resultset e concorrência do método createStatement(int resultSetType, int resultSetConcurrency) não são “bem digeridos” pelo ODBC do Access. Alterei para o método createStatement() e deu certo…

Código antigo:

public static boolean getConexao(String caminho) {
		try {
			Class.forName(DRIVER);
			conexao = DriverManager.getConnection(URL + caminho);
		        stat = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			// JOptionPane.showMessageDialog(null,"Banco de Dados conectado. O robô pode ser executado.");
			return true;
		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null, e.getMessage());
			return false;
		} catch (SQLException e) {
			JOptionPane
					.showMessageDialog(
							null,
							e.getMessage()
									+ "\nO robô não pode ser executado.Entre em contato com o desenvolvedor");
			return false;
		}

Código atualizado:

public static boolean getConexao(String caminho) {
		try {
			Class.forName(DRIVER);
			conexao = DriverManager.getConnection(URL + caminho);
			stat = conexao.createStatement();
			// JOptionPane.showMessageDialog(null,"Banco de Dados conectado. O robô pode ser executado.");
			return true;
		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null, e.getMessage());
			return false;
		} catch (SQLException e) {
			JOptionPane
					.showMessageDialog(
							null,
							e.getMessage()
									+ "\nO robô não pode ser executado.Entre em contato com o desenvolvedor");
			return false;
		}

Valeu pela ajuda! :slight_smile:

Aqui no trabalho to começando a usar Java agora e por enquanto só tenho a disposição o access para trabalhar…é osso…rssss

Mas já estou estudando a possibilidade de utilização do MySql…

Valeu!!!

Resolvido.