Conexão com Banco de Dados

10 respostas
M

Olá Pessoal!!!, Ocorre um erro de tratamento de excessão quando o sistema tenta fazer a conexão com o banco de dados que é o ACCESS, preciso de orientação amigos!!!

Esse é o codigo do cadastro

import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class Cadastrar extends JFrame implements ActionListener
{
  JLabel label1,label2,label3,label4,label5;
  JButton btGravar,btAlterar,btExcluir,btNovo,btLocalizar, btCancelar;
  static JTextField tfCodigo,tfInstrumento,tfCategoria,tfMarca,tfValor;
  JPanel painel1 = new JPanel();
  String Instrumento = "select * from Instrumento";
    
  public static void main(String args[])
  {
    JFrame janela = new Cadastrar();
    janela.setUndecorated(true);
    janela.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
    janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    janela.setVisible(true);
  }
  
  Cadastrar()
  {   
    painel1.setLayout(new FlowLayout(FlowLayout.LEFT));
    label1 = new JLabel("Codigo ");
    label2 = new JLabel("Instrumento");
    label3 = new JLabel("Categoria");
    label4 = new JLabel("Marca");
    label5 = new JLabel("Valor  ");
    tfCodigo = new JTextField(10);
    tfCodigo.addActionListener(this); 
    tfInstrumento = new JTextField(31);
    tfCategoria = new JTextField(9);
    tfMarca = new JTextField(18);
    tfValor = new JTextField(11);
    btGravar=new JButton("Gravar");          
    btAlterar=new JButton("Alterar");
    btExcluir=new JButton("Excluir");
    btLocalizar=new JButton("Localizar");
    btNovo=new JButton("Novo");
    btCancelar=new JButton("Cancelar");
    btGravar.addActionListener(this);
    btAlterar.addActionListener(this);
    btExcluir.addActionListener(this);
    btLocalizar.addActionListener(this);
    btNovo.addActionListener(this);
    btCancelar.addActionListener(this);
    painel1.add(label1);        painel1.add(tfCodigo);   
    painel1.add(label2);        painel1.add(tfInstrumento);  
    painel1.add(label3);        painel1.add(tfCategoria); 
    painel1.add(label4);        painel1.add(tfMarca);
    painel1.add(label5);        painel1.add(tfValor);  
    painel1.add(btNovo);        painel1.add(btLocalizar);   
    painel1.add(btGravar);      painel1.add(btAlterar);   
    painel1.add(btExcluir);     painel1.add(btCancelar);
    getContentPane().add(painel1);
    setTitle("Cadastramento de Instrumentos");
    setBounds(200,100,610,120);
    setResizable(false);
    setBotoes(true,true,false,false,false,false);
    if (!BD.getConnection())
    {
      JOptionPane.showMessageDialog(null, "Falha na conexão, o sistema será fechado!");
      System.exit(0);
    }
  }    

  public void actionPerformed(ActionEvent e)
  {
   	if (e.getSource()==btNovo)
    {
      setBotoes(false,false,true,false,false,true);
      limpaCampos();
      return;
    }
   	if (e.getSource()==btCancelar)
    {
      setBotoes(true,true,false,false,false,false);
   	  limpaCampos();
   	  return;
    }
   	if (e.getSource()==btGravar || e.getSource()==btAlterar)
   	{
   	   String sql = "";
   	   if (e.getSource()==btGravar)
   	   {   
         sql = "INSERT INTO Instrumento (Codigo,Instrumento,Categoria," + 
            "Marca,Valor) Values ('" +
         tfCodigo.getText() + "','" +
   	     tfInstrumento.getText() + "','" +
   	     tfCategoria.getText() + "','" +
   	     tfMarca.getText() + "','" +
   	     tfValor.getText() + "')"; 
   	   }   	  
       if (e.getSource()==btAlterar)
       {
         sql = "UPDATE Instrumento SET " + 
 	       "Codigo='" + tfCodigo.getText() + "'," +
   	   	   "Instrumento='" + tfInstrumento.getText() + "'," +
   	   	   "Categoria='" + tfCategoria.getText() + "'," +
   	   	   "Marca='" + tfMarca.getText() + "'," +
   	   	   "Valor='" + tfValor.getText() + "' " +
   	   	   "WHERE Codigo = '" + tfCodigo.getText() + "'";
       }
       int r = BD.runSQL(sql);
       if (r==1)
       {	   
    	   JOptionPane.showMessageDialog(null,"Operação realizada com sucesso!");
           setBotoes(true,true,false,true,true,false);
       }    
       else
    	   JOptionPane.showMessageDialog(null,"Problemas na operação, verifique se você digitou os campos corretamente!");
       BD.setResultSet(Instrumento);
    } 
   	if (e.getSource()==btExcluir)
   	{
      String sql = "SELECT Codigo, Instrumento FROM Instrumento Where Codigo = '"+tfCodigo.getText()+"'";
      BD.setResultSet(sql);
      String nome = "";
      try
      {
        BD.resultSet.next();
        nome = "Deletar o Instrumento: " + BD.resultSet.getString("Instrumento");
   	  }
   	  catch(SQLException ex1)
   	  {
        JOptionPane.showMessageDialog(null,"Instrumento nao cadastrado!");
        tfCodigo.requestFocus();
        BD.setResultSet(Instrumento);
        return;
      }  
   	  int n = JOptionPane.showConfirmDialog(null,nome," ",JOptionPane.YES_NO_OPTION);
      if (n==JOptionPane.YES_OPTION)
   	  {
   	    sql = "DELETE FROM Instrumento Where codigo = '" + tfCodigo.getText() + "'";
  	    int r = BD.runSQL(sql);
  	    if (r==1)
          JOptionPane.showMessageDialog(null,"Exclusão realizada com sucesso");
        else
          JOptionPane.showMessageDialog(null,"Não foi possível excluir o Instrumento");
        limpaCampos();
        setBotoes(true,true,false,false,false,false);
      } 	
      BD.setResultSet(Instrumento);
    }      
    if (e.getSource()==btLocalizar || e.getSource()==tfCodigo)
   	{
      try
   	  {
   	   	String sql = "SELECT * FROM Instrumento Where Codigo = '" + tfCodigo.getText() + "'";
   	    BD.setResultSet(sql);
        if (BD.resultSet.next())
        {
          atualizaCampos();
          tfInstrumento.requestFocus();
          setBotoes(true,true,false,true,true,false);
        }
        else
        {	
          JOptionPane.showMessageDialog(null,"Instrumento nao Encontrado!");
          tfCodigo.requestFocus();
          BD.setResultSet(Instrumento);
        }  
      }
   	  catch(Exception erro) {}  
   	}      
  }	
  public static void limpaCampos()
  {
    tfCodigo.setText("");
    tfInstrumento.setText("");
    tfCategoria.setText("");
    tfMarca.setText("");
    tfValor.setText("");
    tfCodigo.requestFocus();
  }	
  public void atualizaCampos()
  {
    try
    {
      tfCodigo.setText(BD.resultSet.getString("Codigo"));
      tfInstrumento.setText(BD.resultSet.getString("Instrumento"));
      tfCategoria.setText(BD.resultSet.getString("Categoria"));
      tfMarca.setText(BD.resultSet.getString("Marca"));
      tfValor.setText(""+BD.resultSet.getDate("Valor"));
    }
    catch(SQLException erro) { }
  }
  public void setBotoes(boolean bNovo,boolean bLocalizar,boolean bGravar,boolean bAlterar,boolean bExcluir,boolean bCancelar)
  {
  	btNovo.setEnabled(bNovo);
  	btLocalizar.setEnabled(bLocalizar);
  	btGravar.setEnabled(bGravar);
  	btAlterar.setEnabled(bAlterar);
  	btExcluir.setEnabled(bExcluir);
  	btCancelar.setEnabled(bCancelar);
  }
}

Codigo que faz a conexão com o banco de dados!

import java.sql.*;
public class BD
{
    public static Connection connection = null;
    public static Statement statement = null;
    public static ResultSet resultSet = null; 
    public static final String DRIVER   = "sun.jdbc.odbc.JdbcOdbcDriver";
    public static final String URL      = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=E:/Bancos/LIMusicais.mdb";

    /** 
     * método que faz conexão com o banco de dados
     * retorna true se houve sucesso, ou false em caso negativo
     */
    public static boolean getConnection()
    {
       try
       {
   	      Class.forName(DRIVER);
          connection = DriverManager.getConnection(URL);
          statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
          System.out.println("Conectou");
          return true;
       }
       catch(ClassNotFoundException erro)
       {
       	  erro.printStackTrace();
          return false;
       }
       catch(SQLException erro)
       {
       	  erro.printStackTrace();
          return false;
       }
    }
    
    /**
     * Fecha ResultSet, Statement e Connection
     */
    public static void close()
    {
	   closeResultSet();
	   closeStatement();
	   closeConnection();	
	}
	
	private static void closeConnection()
	{
	   try
	   {
	      connection.close();
	      System.out.println("Desconectou");
	   }
	   catch(SQLException erro)
	   {
	      erro.printStackTrace();
	   } 
	}  

	private static void closeStatement()
	{
	   try
	   {
	      statement.close();
	   }
	   catch(Exception e)
	   {
          e.printStackTrace();
       }
	}

	private static void closeResultSet()
	{
	   try
	   {
	      resultSet.close();
	   }
	   catch(Exception e)
	   {
          e.printStackTrace();
	   }
	}
    
    /**
     * Carrega o resultSet com o resultado do script SQL
     */
    public static void setResultSet(String sql)
    {
	   try
	   {
		  resultSet = statement.executeQuery(sql);
	   }
       catch(SQLException erro)
       {
          erro.printStackTrace();
       } 
    }  

    /**
     * Executa um script SQL de atualização
     * retorna um valor inteiro contendo a quantidade de linhas afetadas
     */
    public static int runSQL(String sql)
    {
	   int quant = 0; 
	   try
	   {
		  quant = statement.executeUpdate(sql);
	   }
	   catch(SQLException erro)
	   {
	   	  erro.printStackTrace();
	   } 
       return quant;
	}  
}

esse codigo com executa uma mensagem de sucesso, quando o acesso ao banco esta ok!

import java.sql.*; 
import javax.swing.*;
class StringConexao
{
  public static void main(String[] args)
  {
    final String DRIVER   = "sun.jdbc.odbc.JdbcOdbcDriver";
    final String URL      = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=E:/LIMusicais.mdb";
    try
    {
      Class.forName(DRIVER);
      Connection connection = DriverManager.getConnection(URL);
      JOptionPane.showMessageDialog(null,"Conexao realizada com sucesso");
      connection.close();    
    }
    catch(ClassNotFoundException erro)
    {
      JOptionPane.showMessageDialog(null,"Driver JDBC-ODBC não encontrado!");
    }
    catch(SQLException erro)
    {
      JOptionPane.showMessageDialog(null,"Problemas na conexao com a fonte de dados");
    }  
  }
}

Desde já agradeço pelas dicas!!!!

10 Respostas

denisspitfire

é que o ACCESS nao é banco de dados kkkkkkkkkk
brincadeira.
Posta o erro

M

kkkkkkkk Valeu! eu achei o erro a versão do ACCESS era diferente. UM ABRAÇO!!!

M

Mas surgiu outro problema, no Banco a variável Valor esta como tipo de dado Valor Monetário, como declarar no código para que quando o sistema chamar essa função, aparecer os valores de acordo como esta na coluna valor do banco, esta aparecendo assim: 1112,00 eu queria que aparecesse assim R$1112,00, que é como esta cadastrado no banco, eis o trecho do codigo abaixo:

tfValor.setText(""+BD.resultSet.getString("Valor"));

assim não aparece nada, eu mudei para Float e aparece assim 1112,00 sem o R$.

Valeu!!!

denisspitfire

para mostrar o valor creio que voce terá que concatenar o R$

thiagoteixeiraoficia

Ao invés de concatenar com vazio, concatena com R$ que resolve :lol:

M

Perfeito Amigos coloquei R$ no espaço vazio e concatenou, mas surgiu outro problema ao gerar a tabela Instrumentos, a coluna onde tem que aparecer os Valores esta aparecendo categoria, Vocês podem me auxiliar como eu faço a modificação no código, creio que seja nesta parte do código, mas não estou conseguindo alterar.

Creio que seja nesta parte do codigo!

ResultSetMetaData rsmd = BD.resultSet.getMetaData();

vou colocar o codigo completo!

import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.util.*;

public class Tabela extends JFrame
{
  JTable table;
  public static void main(String args[])
  {
    JFrame janela = new Tabela();
    janela.setUndecorated(true);
    janela.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
    janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    janela.setVisible(true);
  }
  public Tabela() 
  {   
    setTitle( "Tabela de Instrumentos" );
    setBounds(100,100,800,500);
    if (!BD.getConnection())
    {
      JOptionPane.showMessageDialog(null, "Falha na conexão, o sistema será fechado!");
      System.exit(0);
    }
    geraTabela();
  }

  private void geraTabela()
  {
    try 
    {
      Vector<String> cabecalho = new Vector<String>();
      Vector<Vector> linhas = new Vector<Vector>();
      BD.setResultSet("select * from Instrumento");
	  BD.resultSet.next();  
      ResultSetMetaData rsmd = BD.resultSet.getMetaData();
      for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) 
         cabecalho.addElement( rsmd.getColumnName( i ) );
      do 
      {
         Vector<Object> linhaAtual = new Vector<Object>();
         for ( int i = 1; i <= rsmd.getColumnCount(); i++ )
         {
      	       switch( rsmd.getColumnType(i)) 
        	   {
        	      case Types.VARCHAR:
        	         linhaAtual.addElement(BD.resultSet.getString(i));break;
        	      case Types.TIMESTAMP:
         	         linhaAtual.addElement(BD.resultSet.getFloat(i));break;
        	   }
         }
         linhas.addElement(linhaAtual);     
      } 
      while ( BD.resultSet.next() );       
      table = new JTable( linhas, cabecalho );
      JScrollPane scroller = new JScrollPane( table );
      getContentPane().add(scroller, BorderLayout.CENTER);
      BD.close();
    }
    catch (SQLException erro) { }
  } 
}

Quem puder me orientar agradeço muito!!!

thiagoteixeiraoficia

Você só tem Varchar e Timestamp no banco? Talvez compense vc colocar um outro case pra pegar tipo número ai no seu while e talvez ter um default também.

M

No banco a coluna Valor esta cadastrada com tipo de dado valor monetário, este codigo foi alterado este era um codigo exemplo que eu adaptei para o sistema que eu estou fazendo, como eu sou super iniciante algumas coisas eu não vi ainda! agradeço muito sua orientação!

thiagoteixeiraoficia

Opa, então é importante saber o tipo de informação que se está pegando no banco de dados. Tenta adicionar esse case abaixo no seu código também, e veja como será o comportamento.

case Types.INTEGER:
case Types.NUMERIC:
	linhaAtual.addElement(BD.resultSet.getFloat(i));
	break; 
default:
	String typeName = BD.resultSet.getColumnTypeName(i);
	System.err.println("Tipo " + typeName + " não é suportado!");
}

caso ele caia no default ele vai lhe mostrar o tipo que o banco está lhe devolvendo, testa ai eu fiz aqui rapidinho nem compilei. Qualquer dúvida é só postar ai, boa sorte.
Áh e outra coisa o case ali está certo é um embaixo do outro mesmo :smiley: Abraço

M

Então ele da erro quando eu faço a alteração no getColumnTypeName(i);

case Types.INTEGER: case Types.NUMERIC: linhaAtual.addElement(BD.resultSet.getFloat(i)); break; default: String typeName = BD.resultSet.getColumnTypeName(i); System.err.println("Tipo" + typeName + "não é suportado!");

Tentei mudar para String mas não gera a tabela!

Criado 31 de outubro de 2012
Ultima resposta 2 de nov. de 2012
Respostas 10
Participantes 3