Ajuda?

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();	
}

}

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…

não funcionou… :cry:

No lugar de:

statement.execute(sql);

Tente usar:

statement.executeUpdate(sql);

[]'s

Ja tentei e não funcionou… :cry:

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

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();	
}

}

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

Tente incluir essa linha antes de gravar qualquer coisa:

connection.setAutoCommit(true);

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

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.

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 ?

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

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;&quot;O valor retornado pelo executeUpdate&#58; &quot; + pstmt.executeUpdate&#40;&#41;&#41;; 

[]'s

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

não. Como utilizo o commit ?

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

Será que não seria o mesmo efeito do setAutoCommit(true)?[/quote]

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

[quote=“joseneusa”]não. Como utilizo o commit ?
[/quote]

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

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

connection.setAutoCommit(true);

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.

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: