Banco de Dados - RESOLVIDO

Caros colegas, estou trabalhando em um projeto onde uso FireBird.

O comando para gravar as informações no banco esta retornando erro. Mas não mostra qual é o erro.

O grande problema é que quando digito o mesmo comando direto no banco de dados ele funciona normalmente. já não sei mais ode olhar.

Não é problema de conexão com o banco porque tenho varias outras transações como pesquisas, e inserções. Apenas esse comando que retorna erro.

abaixo segue o codigo.

Manipula_Banco mb = new Manipula_Banco(); mb.altera_Banco("insert into endereco (rua, numero, complemento, bairro, cidade, cep, estado_civil, escola_votacao, " + "cidade_votacao, nome_igreja, nome_pastor, ministerio, tel_res, tel_cel, e_mail, crg_eclesi, dono_end, " + "codigo, crente) values ('" + editRua.getText() + "', " + "'" + editNimero.getText() + "', " + "'" + editComplemento.getText() + "', " + "'" + editBairro.getText() + "', " + "'" + editCidade.getText() + "', " + "'" + editCep.getText() + "', " + "'" + comboEstadoCivil.getSelectedItem() + "', " + "'" + editEscolaVota.getText() + "', " + "'" + editOndeVota.getText() + "', " + "'" + editNomeIgreja.getText() + "', " + "'" + edit_NomePastor.getText() + "', " + "'" + edit_Ministerio.getText() + "', " + "'" + editTelRes.getText() + "', " + "'" + editTelCel.getText() + "', " + "'" + editEmail.getText() + "', " + "'" + edit_CargoEclesiastico.getText() + "', " + "'" + dono_ende + "', " + "'" + editcodigo2.getText() + "', " + "'" + crente + "')") ;

Se alguem puder me ajudar eu agreço.

Obrigado

Posta a mensagem de erro.

E uma sugestão, não use Statement e sim PreparedStatement. Fica muito mais simples montar os inserts.

[quote=romarcio]Posta a mensagem de erro.

E uma sugestão, não use Statement e sim PreparedStatement. Fica muito mais simples montar os inserts.[/quote]

Ja estou usando PreparedStatemente. Esta na classe ManipulaBanco que não foi postada.

[quote=jefersonpo][quote=romarcio]Posta a mensagem de erro.

E uma sugestão, não use Statement e sim PreparedStatement. Fica muito mais simples montar os inserts.[/quote]

Ja estou usando PreparedStatemente. Esta na classe ManipulaBanco que não foi postada.[/quote]

E porque montou seu insert dessa maneira? Intercalando Strings com variáveis?
Use os método do PreparedStatement para atribuir os valores e elimine esse insert que fez.

E coloca a exceção para ver qual é o erro.

[quote=jefersonpo][quote=romarcio]Posta a mensagem de erro.

E uma sugestão, não use Statement e sim PreparedStatement. Fica muito mais simples montar os inserts.[/quote]

Ja estou usando PreparedStatemente. Esta na classe ManipulaBanco que não foi postada.[/quote]

Então você usa o PreparedStatement pra nada, pois não está usando os parâmetros (algo como “insert into endereco (rua, numero, complemento, bairro, … ) values (?,?,?,? …)” e depois inserindo os parâmetros na query que ele te cria).

Sem contar que dessa forma você mandou um convite VIP e com Open Bar pra SQL Injection.

[quote=romarcio]

E porque montou seu insert dessa maneira? Intercalando Strings com variáveis?
Use os método do PreparedStatement para atribuir os valores e elimine esse insert que fez.

E coloca a exceção para ver qual é o erro.[/quote]

Caro Romarcio
Creio que esse tipo de ação que você sugere esta fora dos meus conhecimentos.
Se você conseguir ser um pouco mais didático para que eu consiga pesquisar e dar uma estudada…

De qualquer maneira segue abaixo a classe onde esta o meu PreparedStatement.

[code]public class Manipula_Banco
{
private Connection conexao;

public boolean altera_Banco(String codigo) throws SQLException, ClassNotFoundException
{
conexao = ConexaoBanco.getConexao();
try
{
PreparedStatement executa_codigo = conexao.prepareStatement(codigo);
executa_codigo.execute();
executa_codigo.close();
JOptionPane.showMessageDialog(null, “execução realizada com sucesso”);
return true;
}
catch (Exception s)
{
JOptionPane.showMessageDialog(null, “Falha na Execução do Comando\n” +
“Reinicie o Sistema…”);
return false;
}
}
}
[/code]
O Problema ocorre no momento em que executa a linha “executa_codigo.execute();”
Obrigado

Cara, já analisou se algum campo do seu banco é inteiro ou decimal?
Você está tratando todos como String, então é legal dar uma olhada nisso.
Seria legal você postar o erro aqui.

Estava fuçando aqui nos meus projetos testes, achei um método bacana.

	public void adiciona(contato contato) {
		
		String sql = "insert into tb_contatos " +
		 "(id,nome,email,endereco,dataNascimento)" +
			" values (?,?,?,?,?)";
		
		 try {
			 // prepared statement para inserção
			 	PreparedStatement stmt = connection.prepareStatement(sql);
		
			 	// seta os valores
			 stmt.setLong(1, contato.getId());
			 stmt.setString(2, contato.getNome());
			 stmt.setString(3, contato.getEmail());
			 stmt.setString(4, contato.getEndereco());
			 stmt.setDate(5, new Date(contato.getDataNascimento().getTimeInMillis()));
		
			 // executa
			 stmt.execute();
			 stmt.close();
		 } catch (SQLException e) {
		 	e.printStackTrace();
		 }
	}

Espero que ajude.

Ok, veja no código abaixo. Nele eu tenho um exemplo de insert na tabela Pessoas.
1° passo: cria o insert e em values, você coloca “?” no lugar do que seria o parametro do insert.
2° passo: através do PreparedStatement você tem acesso a vários métodos que recebem os paramentros, você tem métodos do tipos string, date, long, int, etc.
3° passo: cada método deve receber a posição do paramentro em relação aos “?” colocados no insert.

E é isso. Assim elemina aquele monte de string concatenada com aspas simples e parametros java e ainda elemina o risco do tal SQL Inject.

public void save(Pessoa pessoa) { Connection conn = Conexao.open(); PreparedStatement pstm = null; String sql = "INSERT INTO Pessoas (nome, rua, idade) VALUES (?,?,?)"; try { pstm = conn.prepareStatement(sql); pstm.setString(1, entidade.getNome()); pstm.setString(2, entidade.getRua()); pstm.setInt(3, entidade.getIdade()); pstm.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { pstm.close(); conn.close(); } }

Caros colegas. Encontrei a falha…

O campo “dono_ende” é um campo varchar (14), que é preenchido com uma sequencia de letras e números que é gerada automaticamente com 14 caracteres.
O grande problema é que eu colocava mais um digito de controle, fazendo com que a informação ficasse maior que o campo no Banco.

Quando eu digitava direto no banco funcionava porque eu não colocava o digito de controle.

Muito obrigado pela ajuda