Problema com EDIT e DELETE

4 respostas
A

Gostaria da ajuda dos colegas. Estou com uma aplicação e estou com problema nas funções de Editar e Deletar um registro em um banco de dados. Estou utilizando JSP + Struts.

Classe onde estão as instruções SQL e conexão com DB
package controleCartoes.DB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;

import controleCartoes.bean.Usuarios;


public class ControleDB {

	private static ControleDB instancia;

	private ControleDB(){

	}

	public static ControleDB getInstance(){
		if (instancia == null) {
			instancia = new ControleDB();
		}

		return instancia;

	}

	public static void main(String[] args) {

		try {
			ControleDB inf = new ControleDB();
			inf.getConnection();
			System.out.println("Conectando");
		}catch (Exception e){
			e.printStackTrace();
		}
	}

	//Lista toddos os usuários

	public Collection getUsuarios() throws SQLException {
		LinkedList<Usuarios> users = new LinkedList<Usuarios>();
		Connection con = getConnection();
		Statement stmt = (Statement) con.createStatement();
		ResultSet rs = (ResultSet) stmt.executeQuery("SELECT * FROM USUARIO ORDER BY USER_NAME");

		while (rs.next()){
			users.add(new Usuarios (rs.getInt("cod_user"),rs.getString("user_name")));

		}
		rs.close();
		stmt.close();
		con.close();

		return users;
	}

	//Lista usuário selecionado

	public Usuarios getUsuario(int cod_user) throws SQLException {
		Usuarios user  = null;
		Connection con    = getConnection();
		Statement stmt    = (Statement) con.createStatement();
		ResultSet rs      = (ResultSet) stmt.executeQuery("SELEC * FROM usuario WHERE cod_user = '"+cod_user+"' ");

		if (rs.next()) {
			user = new Usuarios(rs.getInt("cod_user"), rs.getString("user_name"));
		}
		rs.close();
		stmt.close();
		con.close();

		return user;
	}

	//Insere usuário na tabela

	public void insereUser (String user_name)throws SQLException {

		Connection con = getConnection();
		PreparedStatement stmt = (PreparedStatement) con.prepareStatement("INSERT INTO USUARIO (User_name) VALUES (?)");
		stmt.setString(1, user_name);

		if (stmt.executeUpdate() <=0){
			throw new SQLException ("Não foi possível inserir usuário" + user_name);
		}
	}

	//Edita usuário selecionado

	public void editaUsuario(String user_name) throws SQLException {

		Connection con          = getConnection();
		PreparedStatement stmt  = (PreparedStatement) con.prepareStatement
		("UPDATE USUARIO set user_name = ? where cod_user = ? ");
		stmt.setString(1, user_name);

		if (stmt.executeUpdate() <= 0) {
			throw new SQLException("Não foi possível editar usuário: " + user_name);
		}

		con.close();
	}

	//Deleta usuário selecionado

	public void deletaUsuario (int cod_user) throws SQLException{

		Connection con = getConnection();
		PreparedStatement stmt = (PreparedStatement) con.prepareStatement
		("DELETE FROM USUARIO WHERE cod_user = ?");
		stmt.setInt(1, cod_user);

		if (stmt.executeUpdate()<=0) {
			throw new SQLException("Não foi possível deletar usuário" + cod_user);

		}
		con.close();
	}

	//Conexão com Banco de Dados

	private Connection getConnection() throws SQLException{

		Connection con = null;
		try
		{
//			Carregando o JDBC Driver
			String driverName = "org.gjt.mm.mysql.Driver"; // MySQL MM JDBC driver
			Class.forName(driverName);

//			Criando a conexão com o Banco de Dados
			String serverName = "localhost";
			String mydatabase = "card";
			String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
			String username = "root";
			String password = "arv52022";
			con = DriverManager.getConnection(url, username, password);
		} catch (ClassNotFoundException e)
		{
//			Driver não encontrado
			System.out.println("O driver expecificado não foi encontrado.");
		} catch (SQLException e)
		{
//			Não está conseguindo se conectar ao banco
			System.out.println("Não foi possível conectar ao Banco de Dados");
		}
		return con;
	}
}
Classe que lista os usuários:
package controleCartoes.actions;

import java.sql.SQLException;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import controleCartoes.DB.ControleDB;


public class ListarUserAction extends Action {
	
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		try{
			ControleDB controle = ControleDB.getInstance();
			Collection users = controle.getUsuarios();
			request.getSession(true).setAttribute("users", users);
			return mapping.findForward("sucesso");
		}catch (SQLException e){
			ActionErrors erros = new ActionErrors();
			erros.add(ActionErrors.GLOBAL_MESSAGE, new ActionError ("erros.sqlerror"));
			saveErrors(request, erros);
			return mapping.findForward("excessoes");
		}
	}

}
Classe de retira o usuário selecionado:
package controleCartoes.actions;

import java.sql.SQLException;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import controleCartoes.DB.ControleDB;
import controleCartoes.bean.Usuarios;

public class PreEditaUserAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		int cod_user = Integer.parseInt(request.getParameter("cod_user"));
		System.out.println("Email: " + cod_user);
		
	    try {
	        ControleDB fachada  = ControleDB.getInstance();
	        
	        //Busca user
	        Usuarios user       = fachada.getUsuario(cod_user);
	        request.getSession(true).setAttribute("user", user);
	        
	        

	        
	        return mapping.findForward("sucesso");
	      } catch (SQLException e) {
	        ActionErrors erros  = new ActionErrors();
	        erros.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.sqlerror"));
	        saveErrors(request, erros);
	        
	        System.out.println("Não entrou no TRY");
	        
	        return mapping.findForward("excecoes");
	      }
	}
}
Este é meu JSP que mostra a lista dos usuários e a opção para Editar ou Deletar usuário específico:
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic"prefix="logic"%>

<html:html locale="true">

<head>
<title><bean:message key="index.title" /></title>
<html:base />
</head>
<body bgcolor="white">
<h2>Lista de usuários cadastrados</h2>
<table border="1">
	<tr>
		<th>Nome</th>
		<th>Editar</th>
		<th>Excluir</th>

	</tr>
	<logic:iterate id="user" name="users">
		<tr>
			<td><div align="center"><jsp:getProperty name="user" property="user_name" /></div></td>
			<td><div align="center"><html:link action="preEditaUser" paramName="user" paramId="cod_user" paramProperty="cod_user">
				<img src="Images/edit_but.gif" width="19" height="19" alt="Editar" border="0" align="center" /></html:link></div>
			</td>
			<td><div align="center"><html:link action="preDeletaUser" paramName="user" paramId="cod_user" paramProperty="cod_user">
				<img src="Images/delete.gif" width="19" height="19" alt="Deletar" border="0" align="center" /></html:link></div>
			</td>

		</tr>
	</logic:iterate>
</table>
<html:link page="/index.jsp">Retornar ao índice</html:link>
</body>

</html:html>

O problema é que quando é escolhido o registro a ser Editado/Deletado não está entrando no bloco TRY da classe PreEditaUserAction, é como se não fosse possível localizar o registro dentro da tabela.

Aguardo ajuda!!!

4 Respostas

ramilani12

Primeiro erro bobo, faltou passar o id do registro para PreparedStatement
na atualização do registro:
Alias prq vc esta usando casting para con.prepareStatement?

public void editaUsuario(String user_name) throws SQLException {
 
 		Connection con          = getConnection();
 		PreparedStatement stmt  = (PreparedStatement) con.prepareStatement
 		("UPDATE USUARIO set user_name = ? where cod_user = ? ");
 		stmt.setString(1, user_name);
                stmt.setInt(2, cod_user); // faltou aqui
 
 		if (stmt.executeUpdate() &lt= 0) {
 			throw new SQLException("Não foi possível editar usuário: " + user_name);
 		}
 
 		con.close();
 	}
A

Alias prq vc esta usando casting para con.prepareStatement?

Porque está dando esse erro: Type mismatch: cannot convert from PreparedStatement to PreparedStatement

Acertei o que estava faltando conforme sua dica. O problema é não consigo carregar a página editauser.JSP abaixo:

<%@ page language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>

<html:html locale="true" >

<head>
  <title><bean:message key="index.title" /></title>
  <html:base/>
</head>
<body bgcolor="white">
  <html:form action="/editaUsuario">
    <h2>Editar usuários</h2>
    <table>
      <tr><td>Nome:</td><td><html:text name="user" property="user"/><html:errors property="user"/></td></tr>
      <tr><td><html:submit/></td><td></td></tr>
    </table>
  </html:form>
  <br>
  <html:link page="/index.jsp">Retornar ao índice</html:link>
</body>

</html:html>
ramilani12

Nossa que louco isso Type mismatch: cannot convert from PreparedStatement to PreparedStatement ele não pode converter p/ PreparedStatement p/ PreparedStatement

mas qual erro que lhe gera ao editar o registro?

arviana:
Alias prq vc esta usando casting para con.prepareStatement?

Porque está dando esse erro: Type mismatch: cannot convert from PreparedStatement to PreparedStatement

Acertei o que estava faltando conforme sua dica. O problema é não consigo carregar a página editauser.JSP abaixo:

<%@ page language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>

<html:html locale="true" >

<head>
  <title><bean:message key="index.title" /></title>
  <html:base/>
</head>
<body bgcolor="white">
  <html:form action="/editaUsuario">
    <h2>Editar usuários</h2>
    <table>
      <tr><td>Nome:</td><td><html:text name="user" property="user"/><html:errors property="user"/></td></tr>
      <tr><td><html:submit/></td><td></td></tr>
    </table>
  </html:form>
  <br>
  <html:link page="/index.jsp">Retornar ao índice</html:link>
</body>

</html:html>
A

Simplesmente na hora dele pegar o cod_user na página listaUser.jsp e levar para página editarUser.JSP ele não vai, fica dando erro passa direto pelo try da classe PreEditauserAction. Não sei porque ele não consegue pegar o cod_user, já revisei a instrução SQL e mesmo assim não dá.

Criado 6 de dezembro de 2006
Ultima resposta 7 de dez. de 2006
Respostas 4
Participantes 2