PreparedStatement, onde está o erro?

8 respostas
R

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

}

}

8 Respostas

rpfragoso

Qual é a mensagem do erro?

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

M
Verifique as linhas:
pstm = "insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)";
Acho que deveria ser algo como:
String sql = "insert into Alunos (Nome, DatNas, UF) values (?, ?, ?)";
PreparedStatement pstm = nConexao.preparedStatement(sql);
A linha:
stm.executeUpdate(cQuerySql);
Não deve receber parâmetros nesta situação, uma vez que você está definindo as bind variables:
stm.executeUpdate();
O código completo ficaria assim:
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();
 
  }

}
R

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)
gilmarcand

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:

R

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
Rodrigo_Rocha_de_Mor

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

R

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

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

Criado 22 de agosto de 2008
Ultima resposta 22 de ago. de 2008
Respostas 8
Participantes 5