Verificar a existência de um Banco SQL. Ajuda

28 respostas
ipixxel

Fala galera.
Estou com uma pequena dúvida. Como faço para verificar se existe um banco de dados [color=blue]SQL [/color]e uma tabela? Caso não exista irei criar eles…
Teria como verificar com algum código [color=orange]JAVA[/color]?
vlw

28 Respostas

Eric_Yuzo

Você pode tentar utilizar meta data para listar as informações.

Segue um exemplo básico para listar as bases de dados:

//Abre a conexão. Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/","root", "root"); //Trabalho com Meta Data. DatabaseMetaData metaData = conn.getMetaData(); ResultSet rs = metaData.getCatalogs(); while (rs.next()) { System.out.println(rs.getString(1)); }Para listar as tabelas utilize o método metaData.getTables e rs.getString(3):

ResultSet rs = metaData.getTables("nomeDoBanco", null, "%", null); while (rs.next()) { System.out.println(rs.getString(3)); }
Se quiser usar comandos específicos de um banco de dados como “show databases” e “show tables” do MySQL, um Statement comum dá conta do recado.

Soulless-BR

Não sei se eu entendi direito, mas também pode usar via SQL direto. Depois que conectou no banco, como o amigo mostrou acima você pode executar a seguinte SQL:

"create database if not exists nomedobanco;" //Cria o banco se ele nao existir. "create table if not exists nometabela (bla bla bla dos campos);" //Cria a tabela se ela nao existir.

Abraços

ipixxel

O que seia [color=blue]DatabaseMetaData metaData = conn.getMetaData(); [/color]

Como faço para conectar a um banco depois da conexão com o sql? Seia na hora de usar? ex: na hora de inserir.

Anime

Hoje estou com dificuldade para entender as duvidas :roll:

Se for o que estou pensando...
package bancodedados;
import java.sql.*;
/**
 *
 * @author 
 */
public class InsereBD 
{
  public static void main(String [] args)
    {
      BDConecta obj=new BDConecta();
      Connection idcon=null;
      idcon=obj.conexaoBD("teste");
      if(idcon != null)
        {
          //-----------------
          //criar uma tabela ataves de um comando sql
          //classe para comando: Statement
          try
          {        
          Statement cmdsql = idcon.createStatement();
     
          cmdsql.executeUpdate("INSERT INTO tbLogin(idUsuario,nome,senha)VALUES(2,'Ana','123')");
      
          cmdsql.close();
          System.out.println("Dados foram inseridos com sucesso");
          }
          catch(SQLException ex)
          {
              System.out.println("Erro na criacao da tabela");
          }
          obj.desconexaoBD(idcon);
        }    
    }
}
ipixxel
eu criei uma classe CriaConexao e o código ta assim:
import java.sql.*;

public class CriaConexao {

    public static Connection getConexao() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conexão com banco de dados concluída");
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "");
        } catch (ClassNotFoundException e) {
            String createdb = "CREATE database IF NOT EXISITS sysi;";
            Connection conn =  DriverManager.getConnection("jdbc:mysql://localhost/", "root", "");
            PreparedStatement s = conn.prepareStatement(createdb);
            s.execute();
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "");
        }
    }
}

pela teoria ele vai tentar conectar ao banco [color=blue]sysi[/color], se não conseguir ele vai cria-lo. Certo?

Será que vai dar certo?

Eric_Yuzo

Veja um pouco mais sobre MetaData neste artigo.

Eric_Yuzo
ipixxel:
eu criei uma classe CriaConexao e o código ta assim:
import java.sql.*;

public class CriaConexao {

    public static Connection getConexao() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conexão com banco de dados concluída");
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "");
        } catch (ClassNotFoundException e) {
            String createdb = "CREATE database IF NOT EXISITS sysi;";
            Connection conn =  DriverManager.getConnection("jdbc:mysql://localhost/", "root", "");
            PreparedStatement s = conn.prepareStatement(createdb);
            s.execute();
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "");
        }
    }
}

pela teoria ele vai tentar conectar ao banco [color=blue]sysi[/color], se não conseguir ele vai cria-lo. Certo?

Será que vai dar certo?


O ClassNotFoundException pode ser lançado pelo método Class.forName(). A exceção lançada pelo getConnection é um SQLException. Ao invés de declará-la, trate-a com o código que esta no catch (ClassNotFoundException e).

ipixxel
sim... erro meu
import java.sql.*;

public class CriaConexao {

    public static Connection getConexao() throws ClassNotFoundException, SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conexão com banco de dados concluída");
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "gotts32");
        } catch (SQLException e) {
            String createdb = "CREATE database IF NOT EXISIST sysi;";
            Connection conn =  DriverManager.getConnection("jdbc:mysql://localhost/", "root", "gotts32");
            PreparedStatement s = conn.prepareStatement(createdb);
            s.execute();
            s.close();
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "gotts32");
        }
    }
Anime

Agora deu certo?

ipixxel

ainda não.... vo fazer o seguinte:

no metodo main vo verificar se exite o banco [color=blue]sysi[/color]. se ele não existir vo criar ele. E na classe CriaConexao vai ficar normal
import java.sql.*;

public class CriaConexao {

    public static Connection getConexao() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "gotts32");
        } catch (ClassNotFoundException e) {
            System.out.println(e);
            System.out.println("erro");
            return null;
        }
    }
}
acho que vai ser mais fácil
Anime

É web ou desktop?Só uma perguntinha,pode parecer boba, vc criou o driver ?

Quero dizer a conecção ODBC…

ipixxel

desktop
criei…eu consegui conectar e fazer todas as operações…só nunca tinha tentado fazer essas verificações da existência de um banco antes de usalo.

Eric_Yuzo

Não é EXISIST e sim EXISTS.

String createdb = "CREATE database IF NOT EXISTS sysi;"
ipixxel
meu metodo main ta assim:
public static void main(String[] args) {
        int exsist =0;
         try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost", "root", "gotts32");
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet rs = metaData.getCatalogs();
            while (rs.next()) {
                System.out.println(rs.getString(1));
                if(rs.getString(1).equals("sysi")){
                    exsist=1;
                }
            }
            if (exsist==1){
                Connection conexao = conn;
                 String sql = "CREATE DATABASE IF NOT EXISTS sysi";
                PreparedStatement stmt = conexao.prepareStatement(sql);
                stmt.execute();
                stmt.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException e) {
            System.out.println(e);
        }




        contatoDAO dao =  new contatoDAO();
        contato c = new contato();
        c.setNome("Igor");
        try {
            dao.insert(c);
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
Anime

ipixxel:
desktop
criei…eu consegui conectar e fazer todas as operações…só nunca tinha tentado fazer essas verificações da existência de um banco antes de usalo.

Quer uma classe que teste o banco,se está conectado?

Anime

Tenho que sair se for isso :

package bancodedados;
import java.sql.*;
/**
 *
 * @author 18693
 */
public class TestaConexaoBD {
public static void main(String [] args){
BDConecta obj=new BDConecta();
Connection idcon=null;
idcon=obj.conexaoBD("teste");
if(idcon != null)
{
    obj.desconexaoBD(idcon);
}    
}
}

Boa sorte!

ipixxel

consegui galera… o código fico assim:

int exsist =0; try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost", "root", "gotts32"); Connection conexao = conn; String sql = "CREATE DATABASE IF NOT EXISTS sysi"; Statement stmt = conexao.createStatement(); stmt.execute(sql); stmt.close(); } catch (SQLException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException e) { System.out.println(e); }

vlw pela ajuda

ipixxel

galera o que ta de errado neste código:

public void criarTabela() throws SQLException{ String sql = "CREATE TABLE IF NOT EXISTS agenda (" + "id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT," + "nome VCHAR(100)," + "endereco TEXT," + "telefone TEXT," + "email VCHAR(100)," + "webpage VCHAR(100)," + "comentario VCHAR(250)," + "PRIMARY KEY (id)" + ")"; Statement stmt = conexao.createStatement(); stmt.execute(sql); stmt.close(); }

Eric_Yuzo

Tenta VARCHAR no lugar de VCHAR. Se não for isto poste poste a exceção.

ipixxel

a Exception :

Exception in thread "main" java.lang.NullPointerException at DAO.contatoDAO.criarTabela(contatoDAO.java:92) at DAO.contatoDAO.insert(contatoDAO.java:22) at sysi.Main.main(Main.java:43) Java Result: 1

ipixxel

galera ja tentei de tudo e continua dando erro.... vo postar as classes

package Conexao;

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

/**
 *
 * @author Igor Gottschalg
 */


public class CriaConexao {

    public static Connection getConexao() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conexao estabelicida");
            return DriverManager.getConnection("jdbc:mysql://localhost/sysi", "root", "gotts32");
        } catch (ClassNotFoundException e) {
            throw new SQLException(e.getMessage());
        }        
    }
}
package DAO;

import Conexao.CriaConexao;
import Objeto.contato;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Igor Gottschalg
 */
public class ContatoDAO {

    private Connection conexao;

    public void ContatoDAO() throws SQLException {
        this.conexao = CriaConexao.getConexao();
    }

    public void insert(contato c) throws SQLException {
        criarTabela();
        String sql = "INSERT INTO agenda (nome,endereco,telefone,email,webpage,comentario) VALUES (?,?,?,?,?,?)";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setString(1, c.getNome());
        stmt.setString(2, c.getEndereco());
        stmt.setString(3, c.getTelefone());
        stmt.setString(4, c.getEmail());
        stmt.setString(5, c.getWebpage());
        stmt.setString(6, c.getComentario());
        stmt.execute();
        stmt.close();
    }

    public void update(contato c) throws SQLException {
        String sql = "UPDATE agenda SET nome=?, endereco=?, telefone=?, email=?, webpage=?, comentario=? WHERE id=?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setString(1, c.getNome());
        stmt.setString(2, c.getEndereco());
        stmt.setString(3, c.getTelefone());
        stmt.setString(4, c.getEmail());
        stmt.setString(5, c.getWebpage());
        stmt.setString(6, c.getComentario());
        stmt.setInt(7, c.getId());
        stmt.execute();
        stmt.close();
    }

    public void delete(contato c) throws SQLException {
        String sql = "DELETE FROM agenda WHERE id=?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setInt(1, c.getId());
        stmt.execute();
        stmt.close();
    }

    public List<contato> getlist(String search) throws SQLException {
        String sql = "SELECT * FROM agenda WHERE nome LIKE ?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setString(1, search);
        ResultSet rs = stmt.executeQuery();

        List<contato> mylist = new ArrayList<contato>();

        while (rs.next()) {
            contato c1 = new contato();
            c1.setNome(rs.getString("nome"));
            c1.setEndereco(rs.getString("endereco"));
            c1.setTelefone(rs.getString("telefone"));
            c1.setEmail(rs.getString("email"));
            c1.setWebpage(rs.getString("webpage"));
            c1.setComentario(rs.getString("comentario"));
            mylist.add(c1);
        }
        rs.close();
        stmt.close();
        return mylist;
    }

    public void criarTabela() throws SQLException {
        String sql = "CREATE TABLE IF NOT EXISTS agenda (id INT(11) NOT NULL AUTO_INCREMENT,nome VARCHAR (100),endereco TEXT,telefone TEXT,email VARCHAR (100),webpage VARCHAR (100),comentario VARCHAR (250),PRIMARY KEY (id))";
        Statement s = conexao.createStatement();
        s.execute(sql);
        s.close();
    }
}
Anime

Oi,

As vezes o problema está no banco e não no código,que banco vc usa…

ipixxel

to usando o [color=red]MYSQL[/color]
mas o estranho que no metodo main eu verifico se o banco existe, e se não ele cria o banco. Isso ta funcionando, mas na depois quando vo conectar para fazer qualquer operação ele da erro, de ponteiro nulo…é muito estranha…pq ele faz uma conexao certa, e a outra da erro

Anime

Desculpe mas nunca usei mysql,achei estranho os seus campos tipo text por isso perguntei,mas deve ser do mysql. :roll:

Mas banco as vezes da trabalho mesmo,vc já tem dados inseridos se não tiver,insere alguns direto no banco e testa novamente…

ipixxel

blz…ainda não tinha tentado… vo inserir e depois posto aki o resultado…vlw

Eric_Yuzo

O problema é que não se declara tipo de retorno em construtor. Portanto seu objeto contatoDAO deve estar sendo construído com o construtor padrão, deixando sua variável conexão com ponteiro nulo, por isso a exceção.

Retire o tipo de retorno do seu construtor

public ContatoDAO() throws SQLException { //Retire a declaração void this.conexao = CriaConexao.getConexao(); }

ipixxel

Eric Yuzo deu certo… eu nem tinha percebido isso, vlw pela ajuda…

ipixxel

Galera agora estou com outro problema…
Tenha uma jTabbedPane com várias abas, com as letras do alfabeto.

dentro de cada aba tenha um jLabel com o nome de jA (até jA24).

preciso que quando eu clicar na aba ele altere o texto da jLabel correspondente da aba.

pensei nisto

jTabbedPane1.getComponentAt(jTabbedPane1.getSelectedIndex()).getName();

da certo?

Criado 14 de outubro de 2010
Ultima resposta 16 de out. de 2010
Respostas 28
Participantes 4