PreparedStatement, onde está o erro?

Oi, pessoal.

Estou testando o PreparedStatement, mas esta com erro. Segue os códigos:

Na classe de conexão com o Banco:
package academico;

import java.sql.*;
import javax.swing.JOptionPane;
import java.sql.PreparedStatement;
public class TestaConexao extends javax.swing.JFrame {
public Connection con = null;
public Statement stm;
public PreparedStatement pstm;
private ResultSet resultado_RS;

public void adicionarDados(String cQuerySql){
try {
stm.executeUpdate(cQuerySql);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}

Na classe de Alunos:
private void jbt_AdicionarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Conexao nConexao = new Conexao();
nConexao.conectaBanco();
// está com erro nesta 4 linhas abaixo. As variáveis (vNome, vDatNas e vUF) existem.
// Estava funcionando normalmente com Statement.
[color=red] pstm = “insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)”;
pstm.setString(1, vNome);
pstm.setDate(2, vdata);
pstm.setString(3, vUF);
[/color] nConexao.adicionarDados(pstm);
} catch(Exception e){
JOptionPane.showMessageDialog(null, “Erro”, “Mensagens”, JOptionPane.INFORMATION_MESSAGE);
e.printStackTrace();
}
}

Qual é a mensagem do erro?

Envolve teu código com as tags “code” por favor.

Verifique as linhas:

Acho que deveria ser algo como:

String sql = "insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)"; PreparedStatement pstm = nConexao.preparedStatement(sql);

A linha:

Não deve receber parâmetros nesta situação, uma vez que você está definindo as bind variables:

O código completo ficaria assim:

[code]package academico;

import java.sql.*;
import javax.swing.JOptionPane;
import java.sql.PreparedStatement;

public class TestaConexao extends javax.swing.JFrame {

public void adicionarDados(PreparedStatement pst){

try {
  pst.executeUpdate();
  /* verificar a possibilidade de commit*/
}catch(Exception e){
  System.out.println(e.getMessage());
}

}

}

Na classe de Alunos:

private void jbt_AdicionarActionPerformed(java.awt.event.ActionEvent evt) {

/* bind variables */
String vNome = “”;
Date vData = null;
String vUF = null;

try {

Conexao nConexao = new Conexao();
nConexao.conectaBanco();

String sql = "insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)";

PreparedStatement pstm = nConexao.preparedStatement(sql);

pstm.setString(1, vNome);
pstm.setDate(2, vData);
pstm.setString(3, vUF);

new TestaConexao().adicionarDados(pstm);

pstm.close();

} catch(Exception e){

JOptionPane.showMessageDialog(null, "Erro", "Mensagens", JOptionPane.INFORMATION_MESSAGE);
e.printStackTrace();

}

}[/code]

Oi,

Deixei o código como você disse, mas ele pede para criar o método PreparedStatement na classe conexão.

PreparedStatement preparedStatement(String sql) {
    throw new UnsupportedOperationException("Not yet implemented");
}

O código ficou assim:
Conexao nConexao = new Conexao();
nConexao.conectaBanco();

String sql = “insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)”;

[color=darkred] PreparedStatement pstm = nConexao.preparedStatement(sql);
[/color]
pstm.setString(1, vNome);
[color=red] pstm.setDate(2, vData);
pstm.setString(3, vUF);
[/color]
new Conexao().adicionarDados(pstm);

pstm.close();

Na compilação, aparece:
Compiling 2 source files to C:\Academico\build\classes
C:\Academico\src\academico\CadAlunos.java:221: cannot find symbol
symbol : method preparedStatement(java.lang.String)
location: class academico.TestaConexao
PreparedStatement pstm = conexao.preparedStatement(sql);
C:\Academico\src\academico\CadAlunos.java:224: cannot find symbol
symbol : variable vData
location: class academico.CadAlunos
pstm.setDate(2, vData);
C:\Academico\src\academico\CadAlunos.java:225: cannot find symbol
symbol : variable vUF
location: class academico.CadAlunos
pstm.setString(3, vUF);
3 errors
FALHA NA CONSTRUÇÃO (tempo total: 2 segundos)

O metodo é assim:

Você colocou:

É prepareStatatement e não preparedStatement. Aliás, quando for postar código, colouque entre [ code ] xxxxxx [ /code ]

Abraço. Bons códigos. :slight_smile:

Oi, Gilmar

Alterei:


     Conexao nConexao = new Conexao();
     nconexao.conectaBanco();

     String sql = "insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)";  

[color=darkred]     PreparedStatement pstm = nConexao.prepareStatement(sql);  [/color]// mas continua com erro na compilação.

     pstm.setString(1, vNome);  
     pstm.setDate(2, new java.sql.Date(vData.getTime()));  
     pstm.setInt(3, vUF);  

     new nConexao().adicionarDados(pstm);  

     pstm.close();  

erro Compilação:

symbol : method prepareStatement(java.lang.String)
location: class academico.TestaConexao
PreparedStatement pstm = conexao.prepareStatement(sql);
1 error

Vei…

A tua classe nConexao está implementando a interface java.sql.Connection?!

Ou vc apenas usa uma conexão dentro dessa classe?!

Quem te retorna um PreparedStatement é o método prepareStatement
da interface java.sql.Connection

Logo quem tem que retornar isso é a tua conexão…

Veja aí…

[]'s

Minha classe conexão é esta:


import java.sql.PreparedStatement;
public class TestaConexao extends javax.swing.JFrame {

  public Connection con = null;
  public Statement stm;
  private ResultSet resultado_RS;
  
  public Connection conectaBanco() {
  	try {
	  Class.forName("org.firebirdsql.jdbc.FBDriver");
	  con = DriverManager.getConnection ("jdbc:firebirdsql:localhost/3050:C:/Acadêmico/academico.fdb", "SYSDBA", "masterkey");
          stm = con.createStatement();
        }
  	catch (Exception e) {
  		System.out.println("Não foi possível conecttar ao banco: "+ e.getMessage());
  	}	
  	return con;	
  	}
 
   public Connection desconectaBanco() {
  	try {
  	     con.close();
	     JOptionPane.showMessageDialog(null, "Desconectou do BD", "Desconectar", JOptionPane.INFORMATION_MESSAGE);
  	}
  	catch(Exception e) {
  		e.printStackTrace();
  	}
  	return con;
  }	

   public void adicionarDados(PreparedStatement pst){
       try {
         pst.executeUpdate();  
      }catch(Exception e){
            System.out.println(e.getMessage());
       }
   }


 public TestaConexao() {
        initComponents();
    }

Fiii,
É exatamente o que eu lhe falei…

Vamos por partes,

Primeiro que vc nunca irá conseguir usar o método preparedStatement() por que tua Classe Conexão não implementa interface Connection,
logo vc não pode fazer isto:

nConexao.prepareStatement(sql);

Como eu disse, preparedStatement() é um método da interface Connection…

Segunda que tua operação .conectaBanco() retorna um objeto Connection, porém nenhum ponteiro o recebe,
então, para não alterar seu método faça o seguinte:

    //...
    Conexao nConexao = new Conexao();
    Connection conAtiva = nConexao.conectaBanco(); //ponteiro para o objeto Connection
    String sql = "insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)";
    PreparedStatement pstm = conAtiva.prepareStatement(sql);//agora sim chamando o método de um objeto Connection
    pstm.setString(1, vNome);    
    pstm.setDate(2, new java.sql.Date(vData.getTime()));    
    pstm.setInt(3, vUF);  

    nConexao.adicionarDados(pstm); 
    //...

Uma coisa que eu não entendi, é por que vc retorna um Connection no método .desconectaBanco()?!
Não tem muita lógica isso, retornar algo que quero encerrar…
E uma dica, o método .executeUpdate() retorna um int… então ao invés de deixar o método .adicionarDados() sem retorno, faça com que ele retorne este valor… para vc poder controlar em sua aplicação se a inserção foi válida…

Dá uma repensada aí… Espero ter ajudado!

[]'s