Jdbc

Pessoal estou querendo pegar o resultado de uma query:

PreparedStatement pstmt2 = connection.prepareStatement(“SELECT * FROM TbSeries WHERE Nome = ?”);
pstmt2.setObject(1, NomeDaSerie.getSelectedItem().toString());

esse resultado eh um ID, utilizo a seguinte sintaxe:
String IDSerie = pstmt2.getResultSet().toString();

jah tentei pegar como inteiro e double e nada deu certo, no promeiro caso ele me retorna:
sun.jdbc.odbc.JdbcOdbcResultSet@7e5130", em vez do valor do ID, alguém podde me ajudar por favor??

[]'s

Monta o while !

while(rs.next()){

String blabla = rs.getString("nome do campo da base");

}

Vc usou a variavel blabla para alocar a informação vinda do banco, mas vc pode adicionar isso em um bean, mais pratico. Agora se vc quiser pegar um inteiro, basta passar o getInt se eu nao me me engano !

Espero que tenha entendido ! Qq coisa posta ai de novo

Abs

Amigão… olhe o javadoc com mais cuidado… vamos ver…

getResultSet te retorna um ResultSet, então:

ResultSet rs = pstmt2.getResultSet();

nesse ResultSet, você tem que navegar nos resultados:

while (rs.next()){ int var1 = rs.getInt("nomedacoluna1"); String var2 = rs.getString("nomedacoluna1"); // ... e por aí vai... }

Abraço,

Armando

o getResultSet retorna um conjunto de resultados, ou seja primeiro você deve coloca-lo numa variável a parte

ResultSet rs = pstmt2.getResultSet();

Depois você deve percorrer o resultado(mesmo que seja apenas um)

String resultadoQueEuQuero
while(rs.next){
   resultadoQueEuQuero = rs.getString("Nome");
}

depois só usar a variável “resultadoQueEuQuero” onde você precisar

Não é assim que se recupara o resultado de uma consulta…
O ResultSet é um conjunto de resultados, ou seja, ele vai representar todos os registros retornados pela consulta efetuada pelo PreparedStatement. O toString do ResultSet não serve pra nada no seu contexto…
O ResultSet é como se fosse uma coleção de linhas de tabela. Essa interface provê métodos para recuperar cada linha e de cada uma destas, cada uma das colunas.
Tente fazer algo assim:

ResultSet rs = pstmt2.executeQuery();
//Estou assumindo que essa consulta SEMPRE retorna só 1 registro
if(rs.next()){
   String idSerie = rs.getString("ID");//Supondo que a coluna se chame ID
   //Faça o que quiser com o idSerie
}else{
   //Informe o usuário que a consulta não encontrou nenhum registro
}

Pessoal, eu jah havia feito isso, no entanto na janela de debug a variável IDSerie aparece como:

“IDSerie” is not a known variable in current context<

e entao o programa sai do meu if!

alguém tem alguma idéia???

Qual a linha que a mensagem de erro indica?

Tem certeza que a busca não está retornando vazia?

e outra coisa no lugar de IDSerie você deve digitar exatamente o nome da coluna, inclusive a diferenciação de maisculo e minúsculo.

nao indica linha, a consulta nao retorna vazio, testei no win sql e funciona.
estou começando a ficar preocupado…rsrsrsrs…help!!!

abs!

Cara, você deve ter feito o seguinte:

//Estou assumindo que essa consulta SEMPRE retorna só 1 registro
if(rs.next()){
String idSerie = rs.getString(“ID”);//Supondo que a coluna se chame ID
}else{
//Informe o usuário que a consulta não encontrou nenhum registro
}

// Tentando fazer alguma coisa com o idSerie aqui…

Foi isso? se sim, não funciona porque está fora de contexto, uma vez que idSerie foi declarado dentro do if. Você tem que declarar fora do if ou usar dentro, o que é mais recomendável. Foi isso mesmo?

Abraço,

Armando

eu declarei e usei dentro, soh q tenho o seguinte problema, quero analisar se o resultado da query foi null ou o ID, para decidir se faço update ou insiro a serie:

 if(!(pstmt2.getResultSet() == null))

mas naum ta saindo ou ele nuca faz update ou nunca insere!!!

tem alguma idéia?

É bem provável que você esteja invocando mais de uma vez esse método para uma mesma consulta. Âcho que você poderia esquecer esse método… Você se certificou de ter invocado pstmt2.executeQuery antes de tentar pegar o ResultSet? Esse executeQuery já te retorna um ResultSet e é ele quem efetivamente “roda” a query no banco.

Obrigado, vou verificar qualquer coisa te pertubo de novo…rsrsrsrsr…
abs!

Ae pessoal olha esse codigo,

private void IncluirSerieActionPerformed(java.awt.event.ActionEvent evt) {
try{

        PreparedStatement pstmt2 = connection.prepareStatement("SELECT * FROM TbSeries WHERE Nome = ?");
        pstmt2.setObject(1, NomeDaSerie.getSelectedItem().toString());

        boolean ret = pstmt2.getMoreResults();

        
        if(!ret){
            ResultSet rs = pstmt2.executeQuery();
            rs.next();
            int IDSerie = rs.getInt(1);
            PreparedStatement pstmt3 = connection.prepareStatement("UPDATE TbSeries SET Nome= ?, TipoAgregacao = ?, Unidade = ?, Fonte = ?, Tag = ?, TipoRetorno = ?, VerificaVol = ?  WHERE ID= ? ");
            pstmt3.setObject(1, NomeDaSerie.getSelectedItem().toString());
            pstmt3.setObject(2, Integer.parseInt(TpAgreg.getText()));
            pstmt3.setObject(3, Unidade.getText().toString());
            pstmt3.setObject(4, fonte.getText().toString());
            pstmt3.setObject(5, Tag.getText().toString());
            pstmt3.setObject(6, TipoRetorno.getSelectedItem().toString());
            pstmt3.setObject(7, VerificaVol.getSelectedItem().toString());
            pstmt3.setObject(8, IDSerie);
            
            int result2 = pstmt3.executeUpdate();

             if (result2 == 1){ 
                output.append("\nUpdate realizado\n");                    
                TpAgreg.setText("");
                Unidade.setText("");
                fonte.setText("");
                Tag.setText("");
             }else{
                output.append("\nNao Realizado\n");
             }
             
        }else{
            PreparedStatement pstmt = connection.prepareStatement("INSERT INTO TbSeries (Nome, TipoAgregacao, Unidade, Fonte, Tag, TipoRetorno, VerificaVol) VALUES( ?, ?, ?, ?, ?, ?, ?)");
            pstmt.setObject(1, NomeDaSerie.getSelectedItem().toString());
            pstmt.setObject(2, TpAgreg.getText().toString());
            pstmt.setObject(3, Unidade.getText().toString());
            pstmt.setObject(4, fonte.getText().toString());
            pstmt.setObject(5, Tag.getText().toString());
            pstmt.setObject(6, TipoRetorno.getSelectedItem().toString());
            pstmt.setObject(7, VerificaVol.getSelectedItem().toString());
            
            
            int result = pstmt.executeUpdate();
            if ( result == 1 ){
                output.append( "\nInserção realizada\n" );
                TpAgreg.setText("");
                Unidade.setText("");
                fonte.setText("");
                Tag.setText("");
            }
            
            else {
                output.append( "\nInserção não realizada\n" );
                TpAgreg.setText("");
                Unidade.setText("");
                fonte.setText("");
                Tag.setText("");
            }
        }
        
        
    } catch ( SQLException sqlex ) {
        sqlex.printStackTrace();
        output.append( sqlex.toString() );
    }

nao consigo com q ele entre no momento certo if(ret), ou ele executa update ou envia uma msgm de exception,ou pula pro else…ja li o doc do getMoreResults() e nao entendo pq naum funciona!

Mas porque você necessita utilizar o getMoreResults?

Tranquilo, realmente nao precisava, utilizei o next().
abs!

Tentando reescrever essa bagunça:

  1. Eu mudaria o sql de Select * frim TbSeries… para Select Nome from TbSeries…
  2. A primeira coluna não é a coluna nome, né? Tem certeza que é a coluna ID? Não é String? Não é long? Por via das dúvidas, declaramos no select que só queremos o campo ID (até porque o resto é perda de tempo na transmissão, e não queremos isso, né?).
  3. Tá criando PreparedStatement’s demais, cria só 2. Um para o recordset e outro pro update/insert (na verdade, se bem feito pode ser 1 só, é só avaliar o recordset antes, mas…)
  4. nao se esqueça de liberar os recursos no final (como os statements, o recodset,…)

Vamos ver como ficaria:

private void IncluirSerieActionPerformed(java.awt.event.ActionEvent evt) {
try{

PreparedStatement pstmt2 = connection.prepareStatement("SELECT ID FROM TbSeries WHERE Nome = ?");
pstmt2.setObject(1, NomeDaSerie.getSelectedItem().toString());
ResultSet rs = pstmt2.executeQuery();
PreparedStatement pstmt = null;
if(rs.next())
{
//se tiver o registro, gera o update
int IDSerie = rs.getInt(1); //VOCE TEM CERTEZA QUE A PRIMEIRA COLUNA É INT?
pstmt = connection.prepareStatement("UPDATE TbSeries SET Nome= ?, TipoAgregacao = ?, Unidade = ?, Fonte = ?, Tag = ?, TipoRetorno = ?, VerificaVol = ? WHERE ID= ? ");
pstmt.setObject(1, NomeDaSerie.getSelectedItem().toString());
pstmt.setObject(2, Integer.parseInt(TpAgreg.getText()));
pstmt.setObject(3, Unidade.getText().toString());
pstmt.setObject(4, fonte.getText().toString());
pstmt.setObject(5, Tag.getText().toString());
pstmt.setObject(6, TipoRetorno.getSelectedItem().toString());
pstmt.setObject(7, VerificaVol.getSelectedItem().toString());
pstmt.setObject(8, IDSerie);

int result2 = pstmt.executeUpdate();

if (result2 == 1){
output.append("\nUpdate realizado\n");
TpAgreg.setText("");
Unidade.setText("");
fonte.setText("");
Tag.setText("");
}
else{
output.append("\nNao Realizado\n");
}

}else{
pstmt = connection.prepareStatement("INSERT INTO TbSeries (Nome, TipoAgregacao, Unidade, Fonte, Tag, TipoRetorno, VerificaVol) VALUES( ?, ?, ?, ?, ?, ?, ?)");
pstmt.setObject(1, NomeDaSerie.getSelectedItem().toString());
pstmt.setObject(2, TpAgreg.getText().toString());
pstmt.setObject(3, Unidade.getText().toString());
pstmt.setObject(4, fonte.getText().toString());
pstmt.setObject(5, Tag.getText().toString());
pstmt.setObject(6, TipoRetorno.getSelectedItem().toString());
pstmt.setObject(7, VerificaVol.getSelectedItem().toString());

int result = pstmt.executeUpdate();
if ( result == 1 ){
output.append( "\nInserção realizada\n" );
TpAgreg.setText("");
Unidade.setText("");
fonte.setText("");
Tag.setText("");
}else {
output.append( "\nInserção não realizada\n" );
TpAgreg.setText("");
Unidade.setText("");
fonte.setText("");
Tag.setText("");
}
}
} catch ( SQLException sqlex ) {
sqlex.printStackTrace();
output.append( sqlex.toString() );
}

Editei na mão, portanto pode ter erros. Espero que ajude.
Abraços, Otávio

Obrigado otávio, jah tinha feito as alterações, mas valeu!

de nada, boa sorte e pense sempre na performance do aplicativo ao escrever, pois refactorig é um saco :slight_smile:

pessoal, escrevi o seguinte código:

//CODE
public void actionPerformed( ActionEvent e ) {
try{
PreparedStatement pstmt = connection.prepareStatement(“SELECT Data, Valor FROM TbValorSerie, TbSeries WHERE TbValorSerie.IDSerie = TbSeries.ID AND Data >= ? AND Data <= ? AND Nome = ?”);

        if (!fields.NomeSerie.getSelectedItem().toString().equals("") && !fields.DataIni.getText().equals("") && !fields.DataFim.getText().equals("")){
            
            SimpleDateFormat formatador = new SimpleDateFormat("dd/mm/yyyy"); 
            dataIn = new java.util.Date();
            dataFim = new java.util.Date();;
            
            try{
                dataIn = formatador.parse(fields.DataIni.getText());
                dataFim = formatador.parse(fields.DataFim.getText());
            }
            catch(ParseException evt){
              evt.printStackTrace();  
            }
            pstmt.setDate(1, new java.sql.Date(dataIn.getTime()));
            pstmt.setDate(2, new java.sql.Date(dataFim.getTime()));
            pstmt.setObject(3, fields.NomeSerie.getSelectedItem().toString());
            
           ResultSet result = pstmt.executeQuery();
           displayResultSet( result, "Histórico da série" );
           
        } else{
            output.append( "\nEntre com o nome da Serie e com as datas Inicial e Final\n" );
            pstmt.close();
        }
    } catch ( SQLException sqlex ) {
        sqlex.printStackTrace();
        output.append( sqlex.toString() );
    }
    
    
    
}

//CODE

Soh que para minha surpresa, quando entro com as datas o nome da série…nada acontece…nem erro…nem exception…por favor preciso de uma luz!