(RESOLVIDO) Erro estranho num stmt - OBRIGADO

19 respostas
jonasjgs2

esta retornando um erro que nao consigo entender a causa
acontece neste comando:
PreparedStatement smtm = connection.prepareStatement(sql);
observem que eu cheguei ate a por um System.out.println para marca, e mostra o sql certinho
desde ja agradeco

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ContatoDAO {

	private Connection connection;

	public void ContatoDao() {
		this.connection = new FabricaDeConexao().getConnection();
	}

	public void Adiciona(Contato contato) {

		System.out.println("b001");

		try {
			// preparando a sentence para insercao

			String sql = "insert into contatos "
					+ "(nome,email,endereco,datanascimento)" + " values (?,?,?,?)";

			System.out.println("b002 "+sql);
			PreparedStatement smtm = connection.prepareStatement(sql);       // o erro acontece nesta linha (java.lang.nullpointerException)
			//PreparedStatement smtm = connection.prepareStatement(sql);

			System.out.println("b003");
			
			// seta os valores
			
			System.out.println("01");
			smtm.setString(1, contato.getNome());
			System.out.println("03");
			smtm.setString(2, contato.getEmail());
			System.out.println("04");
			smtm.setString(3, contato.getEndereco());
//			smtm.setDate(4, new Date(contato.getDataNascimento()
//					.getTimeInMillis()));
			System.out.println("04");
			smtm.setString(4, "01-01-2011");
			System.out.println("05");

			// executa

			smtm.execute();
			smtm.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
}

19 Respostas

alexvingg

A conexão ta sendo realizada com sucesso ?

da uma olhada aqui

http://www.java2s.com/Code/Java/Database-SQL-JDBC/InsertRecordsUsingPreparedStatement.htm

Dan_xD

jonasjgs2:
esta retornando um erro que nao consigo entender a causa
acontece neste comando:
PreparedStatement smtm = connection.prepareStatement(sql);
observem que eu cheguei ate a por um System.out.println para marca, e mostra o sql certinho
desde ja agradeco

Poste o erro que está ocorrendo.

R

Seu construtor não esta sendo acessado:

public void ContatoDao() {  
        this.connection = new FabricaDeConexao().getConnection();  
    }

o certo é assim:

public ContatoDao() {  
        this.connection = new FabricaDeConexao().getConnection();  
    }
jonasjgs2

o erro esta descrito na propria linha no codigo…
e a conexao esta certa

alexvingg

A conexão esta certa porem o como o Renato_natos falou o construtor não está sendo construido
quando vc instancia a classe por isso ele tava dando java.lang.nullpointerException pq o objeto
connection não estava sendo construido.

mateuscs

Como Renato Falou… vc não pode colocar um metodo de conexão sem retorno

public void ContatoDao() { this.connection = new FabricaDeConexao().getConnection(); }

Retire o void.

Dan_xD

Opa, Desculpa.

Falha minha.

Passei direto procurando o erro e não reparei direito no código.

squall926

Boa Tarde!
O Renato esta correto, você não esta chamando o ContatoDao() ; e se esta pensando que ele será chamado quando instanciar a classe, vc deve alterar o nome do metodo para:

public ContatoDAO(){
...
...
...
}

pois, como esta ele não será chamado. Java é sensitive ON.

jonasjgs2

Renato_natos, se eu tiro o void
fica com erro “return type for metodo is missing”

mateuscs

squall926, não entendi sua resolução do problema.

jonasjgs2, voce tem que retornar Tipo Connection, não tipo void.

mateuscs

Exemplo:

static Connection getConexao() throws DukeClubeException {
try {
init();
return DriverManager.getConnection(url, usuario, senha);
} catch (SQLException exc) {
StringBuffer mensagem = new StringBuffer("Não foi possível estabelecer conexão
com o banco de dados.");
mensagem.append("\nMotivo: " + exc.getMessage());
throw new DukeClubeException(mensagem.toString());
}
}
mateuscs

squall926,

reveja seu post, vc não indicou nenhuma solução, a sintaxe dele não esta errada, somente o retorno do metodo.

mateuscs

Resumindo:

Voce instanciou o objeto

private Connection connection;

Correto?

Agora iremos retornar o valor para ele com a sua sintaxe:

this.connection = new FabricaDeConexao().getConnection();

Construa seu metodo e coloque um retorno do mesmo tipo.

Dan_xD
mateuscs:
Exemplo:
static Connection getConexao() throws DukeClubeException {
try {
init();
return DriverManager.getConnection(url, usuario, senha);
} catch (SQLException exc) {
StringBuffer mensagem = new StringBuffer("Não foi possível estabelecer conexão
com o banco de dados.");
mensagem.append("\nMotivo: " + exc.getMessage());
throw new DukeClubeException(mensagem.toString());
}
}

Só não esquece de adicionar o Modificador necessário.

Sem o modificador como está no código, este método não pode ser acessado de fora do pacote.

Adicione por exemplo o "public"
public static Connection getConexao()
mateuscs

Assim que solucionar, escreva resolvido no tópico :smiley:

jonasjgs2

vou mostrar para vcs o projeto
cada uma das classes....

package br.com.jmaster;

import java.sql.*;

public class FabricaDeConexao {
	public Connection getConnection() {
		Connection con;
		System.out.println("Conectando ao banco");
		try {
			System.out.println("parece que conectou");
			con = DriverManager.getConnection(
					"jdbc:sqlserver://localhost:1433;" + "database=mdados",
					"adminsql", "123");

			System.out.println("parece que conectou");

			return con;

		} catch (SQLException e) {
			System.out.println("erro");
			throw new RuntimeException(e);
		}
	}
}

da o erro n ContatoDAO
do geito que esta agora a classe coloquei como Connection e deu pau
ja coloquei como void o problema e o meso
e se eu tirar o void me da um erro como explicado anteriormente

package br.com.jmaster;

import java.sql.Connection;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ContatoDAO {

	private Connection connection;

	public Connection ContatoDao() {
		this.connection = new FabricaDeConexao().getConnection();
		return connection;
	}

	public void Adiciona(Contato contato) {

		System.out.println("b001");

		try {
			// preparando a sentence para insercao

			String sql = "insert into contatos "
					+ "(nome,email,endereco,datanascimento)"
					+ " values (?,?,?,?)";

			System.out.println("b002 " + sql);
			PreparedStatement smtm = connection.prepareStatement(sql);
			// PreparedStatement smtm = connection.prepareStatement(sql);

			System.out.println("b003");

			// seta os valores

			System.out.println("01");
			smtm.setString(1, contato.getNome());
			System.out.println("03");
			smtm.setString(2, contato.getEmail());
			System.out.println("04");
			smtm.setString(3, contato.getEndereco());
			// smtm.setDate(4, new Date(contato.getDataNascimento()
			// .getTimeInMillis()));
			System.out.println("04");
			smtm.setString(4, "01-01-2011");
			System.out.println("05");

			// executa

			smtm.execute();
			smtm.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
}
package br.com.jmaster;

import java.util.Calendar;

public class Contato {

	private Long id;
	private String nome;
	private String email;
	private String endereco;
	private Calendar dataNascimento;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		System.out.println("setou o endereco");
		this.endereco = endereco;
	}

	public Calendar getDataNascimento() {
		System.out.println("Setou a data de nascimento");
		return dataNascimento;
	}

	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

}
import java.util.Calendar;

public class TestaInsere {
	public static void main(String[] args) {

		// Pronto para gravar

		Contato contato = new Contato();
		contato.setNome("jonas");
		contato.setEmail("[email removido]");
		contato.setEndereco("Rua guido morandini,200");
		
		System.out.println("teste001");
		contato.setDataNascimento(Calendar.getInstance());

		System.out.println("teste002");
		// grave nesta conexao

		System.out.println("teste003");

		ContatoDAO dao = new ContatoDAO();

		System.out.println("teste004");

		dao.Adiciona(contato);
		System.out.println("Gravado");

	}
}
mateuscs

Modifique a seguinte sintaxe:

System.out.println("parece que conectou");  
            con = DriverManager.getConnection(  
                    "jdbc:sqlserver://localhost:1433;" + "database=mdados",  
                    "adminsql", "123");  
  
            System.out.println("parece que conectou");

Tente usar o construtor da seguinte forma

Class.forName("Seu Driver");
//Porém não é mais necessario

			// Estabelece a conexão
			this.conexao = DriverManager.getConnection( "Conexão EX:jdbc:h2:tcp://localhost//db/dukeclube/dukeclube" , "usuario", "senha");

Poste seu exception caso gere algum

abimaelrsergio

Toda classe tem um construtor. Seja ele implicito ou explicito.

public class ContatoDao
{
    // variável de instância
    private Connection connection;  
  
    // Construtor publico
    public ContatoDao() {  
        this.connection = new FabricaDeConexao().getConnection();  
    } 
}
Quando a classe ContatoDao é instanciada, o construtor desta classe é chamado. Este construtor inicia a variável de instância connection:
this.connection = new FabricaDeConexao().getConnection();
Não precisa e nem deve colocar um tipo de retorno em um construtor.  
O restante do código parece estar tudo certinho.
Tente isso.
squall926

É simples, o nome da Classe dele é ContatoDAO e o metodo padrão(que não é chamado por causo do sensitive)é ContatoDao, ele não precisa retornor Connection porque é uma variavel global.

Solução:
Faça o seguinte:

package br.com.jmaster;   
  
import java.sql.Connection;   
  
import java.sql.Date;   
import java.sql.PreparedStatement;   
import java.sql.SQLException;   
  
public class ContatoDAO {   
  
    private Connection connection;   
  
    public Connection ContatoDao() {   
 
    }   
  
    public void Adiciona(Contato contato) {   
  
        System.out.println("b001");   
  
        try {   
            this.connection = new FabricaDeConexao().getConnection();  // toda vez que que quer adicionar vc obtem uma connection.
            // preparando a sentence para insercao   
  
            String sql = "insert into contatos "   
                    + "(nome,email,endereco,datanascimento)"   
                    + " values (?,?,?,?)";   
  
            System.out.println("b002 " + sql);   
            PreparedStatement smtm = connection.prepareStatement(sql);   
            // PreparedStatement smtm = connection.prepareStatement(sql);   
  
            System.out.println("b003");   
  
            // seta os valores   
  
            System.out.println("01");   
            smtm.setString(1, contato.getNome());   
            System.out.println("03");   
            smtm.setString(2, contato.getEmail());   
            System.out.println("04");   
            smtm.setString(3, contato.getEndereco());   
            // smtm.setDate(4, new Date(contato.getDataNascimento()   
            // .getTimeInMillis()));   
            System.out.println("04");   
            smtm.setString(4, "01-01-2011");   
            System.out.println("05");   
  
            // executa   
  
            smtm.execute();   
            smtm.close();   
            
        } catch (SQLException e) {   
            throw new RuntimeException(e);   
        }finally{
                   if(connection != null)
                       try{
                                connection.close() /* porque você não estava fechando sua connection? */
                       catch(Exception e){}
        }   
  
    }   
}

A Questão do void é que por não ser o metodo padrão realmente precisa de retorno. faz como acima que funciona… descupe pela demora, muito trabalho…

Criado 11 de agosto de 2011
Ultima resposta 10 de set. de 2011
Respostas 19
Participantes 7