Ajuda?

27 respostas
J

O codigo abaixo e para fazer uma simples inclusao no banco de dados
A tabela foi criada, os campos estão corretos, e conexão foi estabelecida.
Quando executo o comando aparece a seguinte mensagem:
try…
SQL INSERT INTO teste (Nome, Apelido, Cidade) values (‘fulano’,‘fulaninho’,'bsb
');
Inclusao com sucesso :roll:

Ou seja a inclusão acontece para o programa, MAS quando eu abro o banco através do access não tem nada incluido.

Alguém pode testar este codigo por favor, utilize o access mesmo
nome da Tabela: teste
nome dos campos:
Nome - texto
Apelido - texto
Cidade - texto

código do programa:

import java.sql.*;

public class Banco{
private Connection connection;

Banco(){
	String url = "jdbc:odbc:BancoDadosSRO";
	String username = "";
	String password = "";
	try {
	  Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
	  connection = DriverManager.getConnection(url, username, password );
	}
	catch ( ClassNotFoundException cnfex) {
	   System.err.println("Falhou a abertura do driver JDBC/ODBC." );
	   cnfex.printStackTrace();
	   System.exit( 1 );
	}
	catch ( SQLException sqlex ) {
	   System.err.println( "Unable to connect" );
	   sqlex.printStackTrace();
	}
	incluir("fulano","fulaninho","bsb");
}

public void incluir (String nome, String apelido, String cidade){	

	Statement statement;
	try {
		System.out.println("try......");
		String sql = ("INSERT INTO teste (Nome, Apelido, Cidade) values ('"+nome+"','"+apelido+"','"+cidade+"');"); 
		statement.close();
		System.out.println("Inclusao com sucesso");
	}
	catch ( SQLException sqlex ) {
	 sqlex.printStackTrace();
   }
}

public static void main (String arg[]){
     Banco con = new Banco();	
}

}

27 Respostas

brlima

se eu tivesse access aqui instalado ateh testava… :roll:
Mas acho q nao precisa. Vc esqueceu de executar o SQL… Vc cria, mas num faz nada com ele…

Statement statement;
try {
   System.out.println("try......");
   String sql = ("INSERT INTO teste (Nome, Apelido, Cidade) values  ('"+nome+"','"+apelido+"','"+cidade+"');");

   statement.execute(sql);

   statement.close();
   System.out.println("Inclusao com sucesso");
}
   catch ( SQLException sqlex ) {
   sqlex.printStackTrace();
}
}

Acho q é isso…

J

não funcionou… :cry:

caiofilipini

No lugar de:

statement.execute(sql);

Tente usar:

statement.executeUpdate(sql);

[]'s

J

Ja tentei e não funcionou… :cry:

caiofilipini

E a mensagem “Inclusão com sucesso” continua aparecendo, ou está lançando alguma Exception? :roll:

J

A mensagem continua aparecendo. Eu percebi mais uma coisa quando eu executo o programa ele grava um arquivo que é

bdArquivosFTP.ldb

Tipo: Access.LockFile.9

Eu tb mudei o codigo: Para fazer outra tentativa de funcionamento.

Tb não funciona continua com o mesmo problema…
A configuração através do painel de controle ODBC esta correta já conferir varias vezes…

import java.sql.*;

public class Banco{

private Connection connection;

Banco(){

String url = jdbc:odbc:BancoDadosSRO;

String username = “”;

String password = “”;

try {

Class.forName( sun.jdbc.odbc.JdbcOdbcDriver );

connection = DriverManager.getConnection(url, username, password );

incluir(fulano,fulaninho,bsb);

}

catch ( ClassNotFoundException cnfex) {

System.err.println(Falhou a abertura do driver JDBC/ODBC. );

cnfex.printStackTrace();

System.exit( 1 );

}

catch ( SQLException sqlex ) {

System.err.println( Unable to connect );

sqlex.printStackTrace();

}

}
//public void incluir(String endSara, String usuSara, String serSara, String pasSara, String endACF, String usuACF, String serACF, String pasACF) { 
public void incluir (String nome, String apelido, String cidade){	
	try {
		System.out.println("try......");
		String insertString = " INSERT INTO teste " +
                          " VALUES (?,?,?)";
	    PreparedStatement pstmt = connection.prepareStatement(insertString);
        pstmt.setString(1,nome);
        pstmt.setString(2,apelido);
        pstmt.setString(3,cidade);
        pstmt.executeUpdate();
        
        pstmt.close();
        System.out.println("SQL  "+insertString);
		System.out.println("Inclusao com sucesso");
	}
	catch ( SQLException sqlex ) {
	 sqlex.printStackTrace();
   }
}

public static void main (String arg[]){
     Banco con = new Banco();	
}

}

caiofilipini

Droga, não tenho como testar seu código aqui… :roll:

Tente incluir essa linha antes de gravar qualquer coisa:

connection.setAutoCommit(true);
J

continua com o mesmo problema :frowning: :frowning: :frowning: :frowning: :frowning: :frowning:

brlima

pergunta pro banco se ele tem algo contra vc… :slight_smile:

O executeUpdate e o execute retornam valroes booleanos. Tenta pegar o que ta retornando: false ou true.

J

Olha so Bruno,
eu colequei o seguinte comando:

pstmt.executeUpdate();

System.out.println("O valor retornado pelo executeUpdate  "+pstmt.executeUpdate());

pstmt.close();

claro que vai dar um erro porque eu estou inserindo o mesmo dado no banco duas vezes

Mensagem de erro…

java.sql.SQLException: General error

at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.SQLExecute(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(Unknown Source)
at Banco.incluir(Banco.java:40)
    at Banco.<init>(Banco.java:13)
    at Banco.main(Banco.java:52)

E para minha surpresa abri o banco de dados e mesmo com a mensagem de erro os dados foram inseridos.

O comando pstmt.executeUpdate();
aparece duas vezes no programa por isto ocorre o erro, mas mesmo assim inclui no banco de dados, por que erro acontece na segunda vez que ele tenta incluir o mesmo dado no banco. Grava uma vez no banco.

Então tirei a duplicidade do comando pstmt.executeUpdate();

E não grava nenhuma vez os dados no banco.

Entendeu ?? confuso nem ?

brlima

Eita… :shock: :roll:
Ja tentou dar um commit ???

caiofilipini

Weird! :shock:

Seguinte, tenta mudar uma coisinha no seu código. Quando for criar o Statement, passe a String SQL como parâmetro:

String sql = &quot;INSERT INTO...&quot;; Statement statement = connection.createStatement&#40;sql&#41;;

E depois chame executeUpdate() sem parâmetros, como você fez no seu exemplo:

System.out.println&#40;&#40;"O valor retornado pelo executeUpdate&#58; " + pstmt.executeUpdate&#40;&#41;&#41;;

[]'s

caiofilipini

Será que não seria o mesmo efeito do setAutoCommit(true)?

J

não. Como utilizo o commit ?

caiofilipini
connection.commit&#40;&#41;;
brlima

Será que não seria o mesmo efeito do setAutoCommit(true)?

Deveria… :roll:
Mas como eu sou desconfiado, sempre deixo um olho no gato e outro no peixe…

“joseneusa”:
não. Como utilizo o commit ?

connection.commit&#40;&#41;;

J

O programa já tem este comando ? seria isto mesmo… :?: :?:

connection.setAutoCommit(true);

caiofilipini

Então, se você usar o setAutoCommit(true), não é preciso usar o commit(), ele será automático. Mas se o seu autoCommit for false, aí tem que dar o commit() manualmente.

J

sabe o que eu observei tb:

colooquei duas linhas de comando chamando o metodo incluir

incluir(primeiro,primeirinho,df);

incluir(segundo,segundinho,sp);

no metodo incluir tenho o comando:

connection.setAutoCommit(true);

Abro o banco de dados e observo ele inclui somente o primeiro.

Sinistro :shock:

brlima

vc tem q colocar o setAutoCommit antes de executar o insert… :smiley:

brlima

pelo visto Jo, o primeiro fica em cache, do segundo em diante ele comita. To falando pra colocar o commit no fim… hehehehe :smiley:

:twisted:

J

pode ser assim…Já tentei e não funcionou…

connection = DriverManager.getConnection(url, username, password );

connection.setAutoCommit(true);

incluir(ana,aninha,rr);

incluir(maria,mariazinha,ce);

tentei novamente e so inclui a ana. :?

Daqui a pouco voces vão mandar eu para o :twisted: com tanta pergunta ???

brlima

magina Jo… hehehehe :twisted:

Faz um favor… cria mais umas 2 linhas de inclusao… depois de cada uma , dá um connectino.commit(); so pra gente testar… e pode tirar o autocommit ( commenta a linha )

J

Tentei o que foi solicitado Bruno nas não funciona o ultimo ele não inclui mesmo.

Vou estudar a respeito do commit porque não funciona de nenhum jeito. Já coloquei o comando commit em todos os lugares do programa para testar e continua sem funcionar. Estou com vontade de jogar o computador na parede. Se vc tiver algum material ou tutorial pode me infromar. Vou tentar a pagina da sun para procurar algum exemplo semelhante ou explicação a respeito do assunto.

Não compreendo. Porque esta funcionado errado…
:x

brlima

to achando que é algo no seu banco de dados… alguma configurçacao… pq aki eu tenho a mesma coisa que vc , mas no oracle, e funciona direitinho…
O commit nada mais do que nao efetiva no banco as transacoes da sua sessao.
o Autocommit commita assim q vc faz uma transacao. Tipo, depois que vc incluir ele ja comita.
Nao tem mto segredos… :roll:

Abraços

J

Sabe onde estava o problema: nao era o commit

Faltava o comando:

connection.close();

para fechar a conexão. Todos foram incluidos com sucesso. :lol:

brlima

“joseneuza”:
Sabe onde estava o problema: nao era o commit

Faltava o comando:

connection.close();

para fechar a conexão. Todos foram incluidos com sucesso. :lol:

putz… :!: :!: :!: :shock: :x :wink:

Criado 4 de fevereiro de 2004
Ultima resposta 4 de fev. de 2004
Respostas 27
Participantes 3