JDBC - Erro na aplicação

6 respostas
A

Boa noite, estou seguindo um tutorial de um livro para fazer a conexão no MySql, estou usando o drive JDBC, configurei o PATH, mas dá erro ao executar o comando como se a sintase da querySQL estivesse errada, porém se eu digitar a mesma query no MySQL query Brownser, consigo executar.
Segue o meu código:

package lib;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Scanner;
import java.sql.PreparedStatement;

public class InsereEditora {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String stringDeConexao = "jdbc:mysql://localhost:3306/livraria";
		String usuario = "root";
		String senha = "admin";
		
		Scanner entrada = new Scanner(System.in);

		try {
			System.out.println("Abrindo conexao...");
			Connection conexao =
			DriverManager.getConnection(stringDeConexao, usuario, senha);
			System.out.println("Digite o nome da editora: ");
			String nome = entrada.nextLine();
			System.out.println("Digite o email da editora: ");
			String email = entrada.nextLine();
			String textoDoComando = "INSERT INTO editora (nome, email) " +
			"VALUES ('" + nome + "?, ?" + email + "?)";
			PreparedStatement comando = conexao.prepareStatement(textoDoComando);
			System.out.println("Executando comando...");
			comando.execute();
			System.out.println("Fechando conexao...");
			conexao.close();
			}
			catch (Exception e) {
			e.printStackTrace();
			}

	}

}

O erro que aparece é esse:

Abrindo conexao...
Digite o nome da editora: 
t
Digite o email da editora: 
t
Executando comando...
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''t?, ?t?)' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
	at lib.InsereEditora.main(InsereEditora.java:33)

Alguém pode me ajudar?

6 Respostas

Yag

Kra, eu tambem estou com um erro na hora de fazer a conexão, porem eu acho que é um erro na configuração do meu pc, porque meu prof ja olhou o codigo e o bd pelo Team Viwer, jaja te mando o codigo que eu estou usando ;D

Yag

Kra, tu ja olhou se tu criou teu banco de dados bem direitinho ?

A

Cara, eu agora fiquei espantado. Eu mudei a query para fazer um Select para ver se traria resultados, e trouxe. Daí achei estranho não ter funcionado como Insert, então mudei o código da seguinte forma:

String textoDoComando = "INSERT INTO editora (nome, email) " +
			"VALUES (?, ?)";
			PreparedStatement comando = conexao.prepareStatement(textoDoComando);
			comando.setString(1,nome);
			comando.setString(2,email);
			System.out.println("Executando comando...");
			comando.execute();
			System.out.println("Fechando conexao...");
			conexao.close();

Depois disso passou a funcionar, alterando o nome da variável por “?” e usando o setString ele funcionou beleza, o mais estranho é que depois disso voltei para o código antigo e também passou a funcionar, =D.

Valeu!

Yag

kkkk, Você usou o MySql Aministrador para criar o banco de dados ?

A

Eu criei o banco no MySQL Query Brownser, mas já tinha alguns dados populados antes de fazer o teste da aplicação.

E

alexandrebpsjc:
Cara, eu agora fiquei espantado. Eu mudei a query para fazer um Select para ver se traria resultados, e trouxe. Daí achei estranho não ter funcionado como Insert, então mudei o código da seguinte forma:

String textoDoComando = "INSERT INTO editora (nome, email) " +
			"VALUES (?, ?)";
			PreparedStatement comando = conexao.prepareStatement(textoDoComando);
			comando.setString(1,nome);
			comando.setString(2,email);
			System.out.println("Executando comando...");
			comando.execute();
			System.out.println("Fechando conexao...");
			conexao.close();

Depois disso passou a funcionar, alterando o nome da variável por “?” e usando o setString ele funcionou beleza, o mais estranho é que depois disso voltei para o código antigo e também passou a funcionar, =D.

Valeu!

não é estranho, dá uma olhada nessa linha (no primeiro post do tópico)

"VALUES ('" + nome + "?, ?" + email + "?)";

Repare que está finalizando as strings com ? ao invés de '. O certo nesse caso é encapsular com aspas simples (trocar nessa linha o ? por ’ )

Mas, o ideal é usar o PreparedStatement mesmo, pois ele trata as entradas de dados (por exemplo, se tem uma ’ no meio do parâmetro, na hora de enviar ao banco ele troca por ‘’)

Criado 7 de janeiro de 2012
Ultima resposta 8 de jan. de 2012
Respostas 6
Participantes 3