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?
[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…
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;
}