[SOLUCIONADO] Dando insert com JDBC puro usando Mysql

16 respostas
A

Olá pessoal, estou dando insert usando JDBC 4 puro no MySQL, preciso mandar uma instrução para o MySQL na hora de inserção, para
que ele possa pegar a data, veja como estou fazendo, está dando MysqlDataTruncationException pois o MySQL não está assimilando como
uma instrução SQL:

StringBuilder sql = new StringBuilder();  
		sql.append("INSERT INTO"); 
		sql.append(" retorno_conversao");
		sql.append(" (data, isbnIdigital, empresa)");
		sql.append(" VALUES");
		sql.append("(?,?,?)");
try {
			stmt = conexao.prepareStatement(sql.toString());
			stmt.setString(1, "date_format(now(), '%d-%m-%Y')");
			stmt.setLong(2, isbn);
			stmt.setString(3, nomeDoFornecedor);

O problema está nesta linha:

stmt.setString(1, "date_format(now(), '%d-%m-%Y')");

16 Respostas

A

Detalhe, não quero usar Java:

Date date = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy"); // ou MM/dd/yyyy
sysout(formatter.format(date))

Preciso usar MySQL...

drsmachado

Entendi direito ou você possui 3 colunas no banco de dados, uma dia, outra mês e outra ano?
Cara, isso vai contra todas as boas práticas.
Crie apenas um campo e trate a data no código, isso é uma boa prática. Permite que teu programa seja aproveitado futuramente e, até mesmo, facilita eventuais manutenções.
Mas, se você prefere fazer assim, sugiro dar uma olhada aqui http://dev.mysql.com/doc/refman/4.1/pt/date-and-time-functions.html

narciso.benigno

Olá andredecotia, como está?

Por que não usa java? Fica portavel, simples e pode inserir tanto date como timestemp:

por exemplo:

Abraço!

A

Olá narciso, olá drsmachado, primeiramente agradeço ajuda de vocês…

Preciso que seja feito em MySQL pois é desta maneira irá manter a data do servidor, vai que a máquina do cliente esteja bichada (data mal configurada) pois estou fazendo uma aplicação/serviço pontual que irá rodar diretamente no computador cliente, tende? Já sei com é a sintaxe MySQL pra isso, é:

date_format(now(), ‘%d-%m-%Y’)

Conforme citado acima… Só que quando tento passar como instrução ao MySQL via JDBC que da caca… O MySQL não entende como instrução para
converter isso em data -> ex: 08-01-2011… E detalhe, é uma coluna que irá receber na tabela, ex: 08-01-2011

Fui claro?

drigo.angelo

Faz assim, debuga o código e verifica qual a string sql que o preparedstatement está enviando para o banco, talvez está ocorrendo algum problema ao gerar essa string…

Você já rodou essa consulta fora da app (direto no banco)? Deu certo?

pmlm
StringBuilder sql = new StringBuilder();    
 sql.append("INSERT INTO");   
 sql.append(" retorno_conversao");  
 sql.append(" (data, isbnIdigital, empresa)");  
 sql.append(" VALUES");  
 sql.append("(date_format(now(), '%d-%m-%Y'),?,?)");  

 stmt = conexao.prepareStatement(sql.toString());  
 stmt.setLong(1, isbn);  
 stmt.setString(2, nomeDoFornecedor);

Se isso é estático, não tem porque não ir logo no SQL.

narciso.benigno

Tenta o seguinte:

Abraço

A
pmlm:
StringBuilder sql = new StringBuilder();    
 sql.append("INSERT INTO");   
 sql.append(" retorno_conversao");  
 sql.append(" (data, isbnIdigital, empresa)");  
 sql.append(" VALUES");  
 sql.append("(date_format(now(), '%d-%m-%Y'),?,?)");  

 stmt = conexao.prepareStatement(sql.toString());  
 stmt.setLong(1, isbn);  
 stmt.setString(2, nomeDoFornecedor);

Se isso é estático, não tem porque não ir logo no SQL.

Pois é, dá MysqlTruncationException... Ele tenta fazer o seguinte:

INSERT INTO retorno_conversao
(data, isbnIdigital, empresa)
VALUE
(date_format(now(), '%d-%m-%Y'), [telefone removido] , 'EQUIPE INTERNA')

A

Só que ele tentar persistir date_format(now(), ‘%d-%m-%Y’) ao invés de trazir em data pra persistir…

A

Tente definir no campo da tabela uma constraint default com a função que vai retornar a data que precisa. Assim nem precisará de esquentar em mandar isso pela sql da tua aplicação.

Isso acontece porque via JDBC você substitui dinamicamente valores que são passados via parâmetros. O JDBC (até onde conheço) não faz substituição de pedaços da instrução SQL que é mandada pro banco. (desculpa se não soube explicar direito, a idéia é mais clara do que as palavras)

pmlm

E não é isso que tu queres? De que tipo é a coluna data?

A

A coluna é varchar… Mas não executa não transforma aquela instrução em data… Por isso dá pau…

pmlm

varchar com que tamanho? e de que tipo são as outras colunas?

Conforme eu pus, deveria funcionar correctamente.
A query está correcta:INSERT INTO retorno_conversao (data, isbnIdigital, empresa) VALUE (date_format(now(), '%d-%m-%Y'), [telefone removido] , 'EQUIPE INTERNA')

drigo.angelo

#Comoassim ? :shock:

Campo para armazenar datas deve ser do tipo timestamp ou date :!:

A

pmlm:
varchar com que tamanho? e de que tipo são as outras colunas?

Conforme eu pus, deveria funcionar correctamente.
A query está correcta:INSERT INTO retorno_conversao (data, isbnIdigital, empresa) VALUE (date_format(now(), '%d-%m-%Y'), [telefone removido] , 'EQUIPE INTERNA')

Galera, funcionou! Não me pergunte o que fiz! :smiley: hehehe, aliás, não fiz nada e funcionou :shock: … hehehe… Erro tipo disco voador, ninguém vê, se você vê, quando tenta mostrar pra alguém some, e realmente sumiu! hehehe…

Valeu mesmo pela ajuda de cada um…

Abração,

pmlm

#Comoassim ? :shock:

Campo para armazenar datas deve ser do tipo timestamp ou date :!:

Exactamente, e bastaria o now(). Mas nem fui por ai porque me parece que neste momento o erro não é por causa dessa coluna.

Criado 8 de fevereiro de 2011
Ultima resposta 8 de fev. de 2011
Respostas 16
Participantes 6