Java+JDBC

14 respostas
R

Olá galera (:

Meu problema é, consigo consultar minha tabela tudo certinho só que nao estou conseguindo atualiza-la, se alguem conseguir me dar um help irei bostar meu code.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class conexao {
static String status;//como esta a conexao
public static Connection getConnection(){
	Connection con = null;//variavel para conexao
	try{
		//aqui é o driver mysql
		Class.forName("com.mysql.jdbc.Driver").newInstance();//estamos chamando o driver
		
		String url = ".?user=.&password=.";
		con = DriverManager.getConnection(url);//Connection con = new Connection();  
    
        // se der certo
		
        status = "Conexao feita";
		}
	catch (SQLException e){
		status = e.getMessage();//status recebe a excecao
		
	}catch (ClassNotFoundException e){
		status = e.getMessage();
	}catch (Exception e){
		status = e.getMessage();
	}
	return con;
}
}
A main :
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Main {
	public static void main(String[] args) throws SQLException {
	    Connection con = conexao.getConnection();
		System.out.println(conexao.status);
		Statement stm = con.createStatement();
        ResultSet rs = stm.executeQuery("select * from produto");
        while(rs.next())
        {
        	if(rs.getString(2)==null){
        		stm = (Statement) stm.executeQuery("UPDATE produto SET versao  = 54 WHERE versao is null");//problema é aqui creio 
        		
        			
        	}
        	System.out.println("O nome do produto é : "+rs.getString(1));//primeira coluna
        	System.out.println("A versao do produto é : "+rs.getString(2));
        }
        
       
	}

}

14 Respostas

alexandre.ribeiro

O seu problema está na hora me mandar a query para o banco, porque está usando o comando errado. Seu código está assim:

stm = (Statement) stm.executeQuery("UPDATE produto SET versao  = 54 WHERE versao is null");

mas o comando executeQuery serve somente para consultas a banco, para [color=red]Update e Insert[/color] você utiliza o .executeUpdate:

stm = (Statement) stm.executeUpdate("UPDATE produto SET versao  = 54 WHERE versao is null");

Me fala se deu certo. Att.

R

Opa e ai alexandre, eu encontrei outro problema tambem mais ja consertei no meu if era pra ser usado if(rs.getString(2).equals("")){ e nao apenas “==”

Entao cara, n ajudou muito nao, agora esta dando um problema que nem o eclipse consegue ajudar, “Cannot cast from int to Statement”

wbdsjunior

o retono do método Statement.executeUpdate é um int (a quantidade de linhas atualizadas).

sendo assim, você não pode fazer um cast para Statement, por que int e Statement são tipos incompatíveis.

R

Criei uma variavel, apenas para armazenar o numero de linhas modificadas int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");

Mas o erro persiste : Exception in thread “main” java.sql.SQLException: Operation not allowed after ResultSet closed

alexandre.ribeiro

roskinha:
Opa e ai alexandre, eu encontrei outro problema tambem mais ja consertei no meu if era pra ser usado if(rs.getString(2).equals("")){ e nao apenas “==”

Entao cara, n ajudou muito nao, agora esta dando um problema que nem o eclipse consegue ajudar, “Cannot cast from int to Statement”

Você está fazendo errado na hora de mandar a query, pois a variável stm não precisa de retorno.
Faz da seguinnte forma, somente:

stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");
[color=brown]ao invés de:[/color]

stm = (Statement) stm.executeUpdate("UPDATE produto SET versao  = 54 WHERE versao is null");
R

Pensei nisso tambem, so que ocorre o erro igual o postado acima Exception in thread “main” java.sql.SQLException: Operation not allowed after ResultSet closed

wbdsjunior

roskinha:
Pensei nisso tambem, so que ocorre o erro igual o postado acima Exception in thread “main” java.sql.SQLException: Operation not allowed after ResultSet closed

crie um novo Statement.

while(rs.next()) { if(rs.getString(2) == null){ stm = con.createStatement(); // aqui int x = stm.executeQuery("UPDATE produto SET versao = 54 WHERE versao is null");

alexandre.ribeiro

Cara, eu faço as classes um pouco diferente que você para consultas e inserções no banco. Vou postar aki umas classe que utilizei em um trabalho que talvez possa lhe servir de base para alguma dúvida:

[color=red]Esta classe é a conexão, que utilizo em minhas outras classes para busca e inserção no banco:[/color]

package BD;

import java.sql.*;
public class Conexao {
    private Connection conn;
    //Método construtor
    public Conexao(){
        try{          
          Class.forName("com.mysql.jdbc.Driver");
          conn = DriverManager.getConnection(
                  "jdbc:mysql://localhost/salesmanager","root","xnddnas2");

        //INformando conexão OK
        System.out.println("Sucesso na conexão!!");
        }
        catch (ClassNotFoundException cnfe){
            System.out.println(cnfe.getMessage());
        }
        catch (SQLException sqlex){
            System.out.println(sqlex.getMessage());
        }
    }
    public Connection getConexao(){
        return conn;
    }
    //Método fechar implementado com polimorfismo, responsável por fechar
    //as tabelas abertas
    public void fechar(ResultSet rs){
        if(rs!=null){
            try{
                rs.close();
            }
            catch(Exception e){}
        }
    }
    public void fechar(java.sql.Statement stmt){
        if(stmt!=null){
            try{
                stmt.close();
            }
            catch(Exception e){}
        }
    }
    //Mètodo responsável por encerrar a conexão com o BD
    public void fecharConexao(){
        if(conn!=null){
            try{
                conn.close();
            }
            catch(Exception e){}
        }
    }
}
[color=red]Esta classe é a que utilizo em minhas Inserções e Atualizações (note que faço esta separada da de consulta):[/color]
import BD.Conexao;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;

public class Inserir_ExcluirDadosTabela {

    private String status = "";
    Mensagem msg = null;

    public Inserir_ExcluirDadosTabela(String sql, String tipo, boolean exibirMensagem) {
        //Captuando a string de conexão da classe conexão
        Conexao c = new Conexao();
        Connection conn = c.getConexao();
        try{
           //Cria um statement para podermos mandar um SQL para o banco
            Statement stmt = conn.createStatement();

           //Mandamos o SQL para o banco            
            stmt.executeUpdate(sql);            

            if(exibirMensagem) {
                if(tipo.equalsIgnoreCase("Inserção"))
                    msg = new Mensagem("Registro Inserido com Sucsso!", "I");
                else
                     msg = new Mensagem("Registro Excluído com Sucsso!", "I");
            }

            status = "ok";

        } catch (SQLException ex) {
             System.out.println("Erro de SQL");
             System.out.println(ex.getMessage());
             msg = new Mensagem("Erro de Inserção no Banco de Dados", "A");
             status = "erro";
       }
    }

    /**
     * @return the status
     */
    public String getStatus() {
        return status;
    }
}
[color=red]E esta classe é a que utilizo em minhas Consultas no banco (select):[/color]
import BD.Conexao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;

public class ConsultasBanco {

    private String NomeCli = "", NomeProd = "", Cpf = "", Rua = "", Bairro = "",  Cidade = "", DataVenda = "";
    private String UF = "", Cep = "", Tel = "", Sexo = "", Email = "", DataVencimento = "", Observacao = "";
    private long   CodCli = 0, CodProd = 0, CodVenda = 0;
    private double EstoqueAtual = 0, EstoqueMin = 0, PrecoCusto = 0, PrecoVenda = 0, VlrDevido = 0, VlrPago = 0;
    private double NotaFiscal = 0, TotalPagar, VlrUnitario = 0, Qtde = 0, VlrTotal = 0;
    
    //Método construtor
    public ConsultasBanco(String sql, String tabela){
        //Captuando a string de conexão da classe conexão
        Conexao c = new Conexao();
        Connection conn = c.getConexao();
        try{
           //Cria um statement para podermos mandar um SQL para o banco
            Statement stmt = conn.createStatement();

           //Mandamos o SQL para o banco e obtemos um ResultSet
            ResultSet rs = stmt.executeQuery(sql);


            String aux = "";            
          
            if(tabela.equalsIgnoreCase("Cliente")) {
               exibicao = "\n     [ DADOS PESSOAIS: ]";
               //Percorrendo o ResultSet e obtendo os valores do banco
               while (rs.next()) { 
                   //será usado para pesquisa
                   aux = rs.getString("CodCliente");
                   if (!rs.wasNull()) {
                       CodCli = Long.parseLong(aux);
                   }

                   aux = rs.getString("Nome");
                   if (!rs.wasNull())  {
                       NomeCli = aux;
                   }
                   aux = rs.getString("Cpf");
                   if (!rs.wasNull())  {
                       Cpf = aux                
                   }
                   aux = rs.getString("Tel");
                   if (!rs.wasNull())  {
                       Tel = aux;
                   }
                   
                   aux = rs.getString("Rua");
                   if (!rs.wasNull())  {
                       Rua = aux;
                   }
                   aux = rs.getString("Bairro");
                   if (!rs.wasNull())  {
                       Bairro = aux;
                   }
                   aux = rs.getString("Cidade");
                   if (!rs.wasNull())  {
                       Cidade = aux;
                   }
                   aux = rs.getString("UF");
                   if (!rs.wasNull())  {
                       UF = aux;
                   }
                   aux = rs.getString("Cep");
                   if (!rs.wasNull())  {
                       Cep = aux;
                   }
                    aux = rs.getString("Email");
                    if (!rs.wasNull()) {
                        Email = aux;
                    }
                } // while               
            } 

       
            if(tabela.equalsIgnoreCase("Produto")) {            
               //Percorrendo o ResultSet e obtendo os valores do banco
               while (rs.next()) {
                   
                   aux = rs.getString("CodProduto");
                   if (!rs.wasNull()) {
                       CodProd = Long.parseLong(aux);                
                   }

                   aux = rs.getString("Nome");
                   if (!rs.wasNull())  {
                       NomeProd = aux;                 
                   }

                   aux = rs.getString("EstoqueAtual");
                   if (!rs.wasNull())  {
                       EstoqueAtual = Double.parseDouble(aux);               
                   }
                   
                   aux = rs.getString("EstoqueMin");
                   if (!rs.wasNull())  {
                       EstoqueMin = Double.parseDouble(aux);  
                   }
                   
                   aux = rs.getString("PrecoCusto");
                   if (!rs.wasNull())  {
                       PrecoCusto = Double.parseDouble(aux);
                   }
                   
                   aux = rs.getString("PrecoVenda");
                   if (!rs.wasNull())  {
                       PrecoVenda = Double.parseDouble(aux);
                   }
                   
                } // while
            } 

            
        } catch (SQLException ex) {
             System.out.println("Erro de SQL");
             System.out.println(ex.getMessage());
       }
    }
}
R
while(rs.next())
        {
        	if(rs.getString(2).equals("")){
        		stm = con.createStatement(); // aqui  
        		int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");          		
        	
        	}

Usei executeUpdate, executeQuery nao aceita updates, nao esta mais ocorrendo erro, so que minha tabela nao esta sendo atualizada : ((

lazaropj
roskinha:
while(rs.next())
        {
        	if(rs.getString(2).equals("")){
        		stm = con.createStatement(); // aqui  
        		int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");          		
        	
        	}

Usei executeUpdate, executeQuery nao aceita updates, nao esta mais ocorrendo erro, so que minha tabela nao esta sendo atualizada : ((

Cara... vc está usando o
rs.getString
mas vc está passando um int será q pod ser isso?
wbdsjunior
lazaropj:
roskinha:
while(rs.next())
        {
        	if(rs.getString(2).equals("")){
        		stm = con.createStatement(); // aqui  
        		int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");          		
        	
        	}

Usei executeUpdate, executeQuery nao aceita updates, nao esta mais ocorrendo erro, so que minha tabela nao esta sendo atualizada : ((

Cara... vc está usando o
rs.getString
mas vc está passando um int será q pod ser isso?
este inteiro é número da coluna.
wbdsjunior
roskinha:
while(rs.next())
        {
        	if(rs.getString(2).equals("")){
        		stm = con.createStatement(); // aqui  
        		int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");          		
        	
        	}

Usei executeUpdate, executeQuery nao aceita updates, nao esta mais ocorrendo erro, so que minha tabela nao esta sendo atualizada : ((


seu banco de dados faz autocommit? creio que o mysql faça isso por padrão, mas pode ser configurado para não fazê-lo.

você pode tentar "commitar" as alterações manualmente.

int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");
    }
    System.out.println("O nome do produto é : " + rs.getString(1)); //primeira coluna
    System.out.println("A versao do produto é : " + rs.getString(2));
}
con.commit(); // aqui
wbdsjunior
roskinha:
while(rs.next())
        {
        	if(rs.getString(2).equals("")){
        		stm = con.createStatement(); // aqui  
        		int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");          		
        	
        	}

Usei executeUpdate, executeQuery nao aceita updates, nao esta mais ocorrendo erro, so que minha tabela nao esta sendo atualizada : ((


outra coisa:

você não fechou a conexão em lugar algum.

int x = stm.executeUpdate("UPDATE produto SET versao = 54 WHERE versao is null");
        stm.close(); // aqui
    }
    System.out.println("O nome do produto é : " + rs.getString(1)); //primeira coluna
    System.out.println("A versao do produto é : " + rs.getString(2));
}
rs.close(); // aqui
con.close(); // aqui
R

Tentei de tudo, e o erro persiste, sera que é possivel realizer o que estou querendo ?

Operation not allowed after ResultSet closed

Criado 22 de dezembro de 2010
Ultima resposta 23 de dez. de 2010
Respostas 14
Participantes 4