Trabalho da Faculdade - Urgente

13 respostas
S

Amigos,

Estou fazendo um trabalho da faculdade utilizando WebServices.
O trabalho se resume em:
a) Criar uma tabela ".mdb" com o nome produtos, com os campos: codigo, nome, descrição, quantidade e preço;
b) Iniciar um novo projeto dinâmico e criar um webservice nele, com duas classes: uma de conexão ao banco e outra para movimentação dos produtos (incluir, excluir, alterar, consultar, etc);
c) Iniciar outro projeto dinâmico e criar um client (webservice) utilizando uma página "jsp" para interagir com o banco. No primeiro momento foi apenas criado um formulario para inserção dos dados.

Não estou conseguindo fazer a inclusão dos dados, está dando um erro no método "adicionarProd" - Erro: The server encountered an internal error () that prevented it from fulfilling this request.

Segue abaixo os meus fontes para ver se alguém me dá uma luz:

index.jsp
---------

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>

<%@ page import="eu.teste.*"%>
<%
	
	String acao = request.getParameter("cadastrar");
	if ("cadastrar".equals(acao)){
		MovProdutos server = new MovProdutosServiceLocator().getMovProdutos();
		String nome = request.getParameter("nome");
		String descricao = request.getParameter("descricao");
		String qtde = request.getParameter("qtd");
		String precounit = request.getParameter("preco");
		int qtd = Integer.parseInt(qtde);
		double preco = Double.valueOf(precounit);
		server.adicionarProd(nome,descricao,qtd,preco);
		out.println("Produto Inserido!");
	}
	
%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Produtos On-Line</title>
</head>
<body>
<font face="verdana" size="4" color="red">INSERIR PRODUTOS:</font>
<form name="InserirProd" action="index.jsp" method="post">
Nome<input type="text" name="nome"><BR>
Descrição<input type="text" name="descricao"><BR>
Quantidade<input type="text" name="qtd"><BR>
Preço<input type="text" name="preco"><BR>
<input name="cadastrar" type="submit" value="cadastrar"></form>

</body>
</html>
Método de conexão ao banco --------------------------
package eu.teste;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtil {
	
	private static Connection conn;
	
	public static Connection getConnection(){
		if (conn != null) return conn;
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Users\Sergio\Desktop\workspace1604\ServidorProdutos\produtos.mdb");
			return conn;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
	}
}
Método para adicionar os produtos ---------------------------------
package eu.teste;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import eu.teste.DBUtil;

public class MovProdutos {

	public int adicionarProd(String nome, String descricao, int qtd, double preco) throws SQLException {

		Connection conn = DBUtil.getConnection();
		PreparedStatement pstmt = conn
				.prepareStatement("INSERT INTO PRODUTOS(NOME,DESCRICAO,QTD,PRECO) VALUES(?,?,?,?)");
		
		//primeiro campo da tabela é com autonumeração
		pstmt.setString(2, nome);
		pstmt.setString(3, descricao);
		pstmt.setInt(4, qtd);
		pstmt.setDouble(5, preco);

		pstmt.execute();

		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select max(codigo) from produtos");
		
		return rs.getInt(1);
	}
	
	
}

13 Respostas

Zeed01

Boa noite colegas !

Não entendo nada de webservice mas independente disso, acho que a sua classe de inserção de dados tem um problema, o primeiro parametro do método setString é parameterIndex que no help diz o seguinte:

* @param parameterIndex the first parameter is 1, the second is 2, …

Ou seja, ele vai olhar no seu Statement para saber onde substituir cada valor e não na tabela do seu banco de dados.

Eu acho que deveria ficar assim:

PreparedStatement pstmt = conn   
                .prepareStatement("INSERT INTO PRODUTOS(ID_PRODUTO,NOME,DESCRICAO,QTD,PRECO) VALUES(?,?,?,?,?)");   
           
        //primeiro campo da tabela é com autonumeração   
        pstmt.setInt(1, null);  
        pstmt.setString(2, nome);   
        pstmt.setString(3, descricao);   
        pstmt.setInt(4, qtd);   
        pstmt.setDouble(5, preco);   
  
        pstmt.execute();

Supondo que o campo autoincrement seja ID_PRODUTO.
Ou talvez nem seja necessário incluir o parametro deste campo que é autoincrement no insert.

[]S

danielbussade

Zeed01:
Boa noite colegas !
Ou talvez nem seja necessário incluir o parametro deste campo que é autoincrement no insert.

[]S

Como o colega disse, nem é preciso incluir o parametro quando ele estiver mapeado para auto-increment.

PreparedStatement pstmt = conn   
                .prepareStatement("INSERT INTO PRODUTOS(NOME,DESCRICAO,QTD,PRECO) VALUES(?,?,?,?,?)");   
           
        //primeiro campo da tabela é com autonumeração   
        pstmt.setString(1, nome);   
        pstmt.setString(2, descricao);   
        pstmt.setInt(3, qtd);   
        pstmt.setDouble(4, preco);   
  
        pstmt.execute();

Att

S

Amigos,

O erro não está nestas dicas, já havia tentado antes fazer das duas formas mencionadas, porém dá erro de cursor, ou seja, a ordem dos campos da tabela não coincidem com a do método de inserção de dados. Infelizmente o problema não está ai.

Utilizando as dicas --> Erro: java.sql.SQLException: [Microsoft][Driver ODBC para Microsoft Access] Tipo de dados imcompatível na expressão de critério.

Se alguém puder ajudar agradeço

[]'s

Zeed01:
Boa noite colegas !

Não entendo nada de webservice mas independente disso, acho que a sua classe de inserção de dados tem um problema, o primeiro parametro do método setString é parameterIndex que no help diz o seguinte:

* @param parameterIndex the first parameter is 1, the second is 2, …

Ou seja, ele vai olhar no seu Statement para saber onde substituir cada valor e não na tabela do seu banco de dados.

Eu acho que deveria ficar assim:

PreparedStatement pstmt = conn   
                .prepareStatement("INSERT INTO PRODUTOS(ID_PRODUTO,NOME,DESCRICAO,QTD,PRECO) VALUES(?,?,?,?,?)");   
           
        //primeiro campo da tabela é com autonumeração   
        pstmt.setInt(1, null);  
        pstmt.setString(2, nome);   
        pstmt.setString(3, descricao);   
        pstmt.setInt(4, qtd);   
        pstmt.setDouble(5, preco);   
  
        pstmt.execute();

Supondo que o campo autoincrement seja ID_PRODUTO.
Ou talvez nem seja necessário incluir o parametro deste campo que é autoincrement no insert.

[]S

Zeed01

Bom dia colegas !

SerginhoLapolli:

Você conseguiu identificar que o erro é realmente na linha do Insert ?
Pela mensagem que enviou agora: os tipos de dados da classe e tabela estão iguais ?
Tem ai o script da tabela PRODUTOS ? Ou a própria tabela.

[]s

GustavoLaguna

Me bateu uma grande duvida aqui.

Voce declarou o método adicionarProd assim:

public int adicionarProd(String nome, String descricao, int qtd, double preco) throws SQLException

Ou seja, voce está repassando a excessão para que o método que o chame tenha que tratá-la. Sendo assim, no bloco de código seguinte voce não tratou a exceção, isso não deveria gerar um erro?

<%
	
	String acao = request.getParameter("cadastrar");
	if ("cadastrar".equals(acao)){
		MovProdutos server = new MovProdutosServiceLocator().getMovProdutos();
		String nome = request.getParameter("nome");
		String descricao = request.getParameter("descricao");
		String qtde = request.getParameter("qtd");
		String precounit = request.getParameter("preco");
		int qtd = Integer.parseInt(qtde);
		double preco = Double.valueOf(precounit);
		server.adicionarProd(nome,descricao,qtd,preco);
		out.println("Produto Inserido!");
	}
	
%>
S

Bom dia!

Eu não tenho muito experiência em programação, está todo mundo na sala com algum tipo de problema neste trabalho que o professor passou, ou seja, até agora ninguém conseguir fazer a inserção de dados na tabela “.mdb”.

Quanto a sua pergunta, acho que o erro é no insert sim, pois as mensagens de erro variam, conforme altero os dados de inserção, conforme as dicas me passadas acima, por exemplo colocar o campo código como “null”.

A minha tabela foi montada com apenas cinco campos (tabela MS Access):

Codigo = autoincrement
Nome = texto
Descrição = texto
Quantidade = número
Preço = valor monetário

Estou totalmente perdido para resolver este problema.

Abraços

Sergio


Zeed01:
Bom dia colegas !

SerginhoLapolli:

Você conseguiu identificar que o erro é realmente na linha do Insert ?
Pela mensagem que enviou agora: os tipos de dados da classe e tabela estão iguais ?
Tem ai o script da tabela PRODUTOS ? Ou a própria tabela.

[]s

S

Gustavo, bom dia!

Como tenho falado, eu não tenho muita experiência em programação e estou utilizando o Eclipse para fazer este trabalho. O Eclipse ajuda muito na programação, ele praticamente insere as exceções sozinho, apenas apertando Crtl + 1 quando aparecer um erro sublinhado em vermelho, assim que implementei a exceção que vc mencionou.

Se eu rodar o código sem utilizar o banco de dados, ele funciona, o problema realmente está na inserção dos dados no banco!

Valeu pela ajuda ...

Sergio

--------------------------------------------------

GustavoLaguna:
Me bateu uma grande duvida aqui.

Voce declarou o método adicionarProd assim:

public int adicionarProd(String nome, String descricao, int qtd, double preco) throws SQLException

Ou seja, voce está repassando a excessão para que o método que o chame tenha que tratá-la. Sendo assim, no bloco de código seguinte voce não tratou a exceção, isso não deveria gerar um erro?

<%
	
	String acao = request.getParameter("cadastrar");
	if ("cadastrar".equals(acao)){
		MovProdutos server = new MovProdutosServiceLocator().getMovProdutos();
		String nome = request.getParameter("nome");
		String descricao = request.getParameter("descricao");
		String qtde = request.getParameter("qtd");
		String precounit = request.getParameter("preco");
		int qtd = Integer.parseInt(qtde);
		double preco = Double.valueOf(precounit);
		server.adicionarProd(nome,descricao,qtd,preco);
		out.println("Produto Inserido!");
	}
	
%>
G

Cara,

Está realmente conectando no Banco de Dados mdb???

Eu particularmente achei estranho esse trecho de conexão:

Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Users\Sergio\Desktop\workspace1604\ServidorProdutos\produtos.mdb");
GustavoLaguna

Cara, melhor forma de voce descobrir esse erro é marcar um breakpoint e ir executando linha a linha, assim voce sabe se a conexao foi aberta e por ai vai… até encontra exatamente qual a linha que está causando o erro!

Faz isso, e passa os dados pra gente aqui.

S

Amigo,

Obrigado pela ajuda … consegui resolver com o professor, era um erro simples de sintaxe do resultSet.

Valeuuu!

[]'s

GustavoLaguna:
Cara, melhor forma de voce descobrir esse erro é marcar um breakpoint e ir executando linha a linha, assim voce sabe se a conexao foi aberta e por ai vai… até encontra exatamente qual a linha que está causando o erro!

Faz isso, e passa os dados pra gente aqui.

GustavoLaguna

:thumbup:

G

Manda a correção pra gente!

É tão triste ver um tópico onde o programa funcionou corretamente e não postou o resultado final… ^^

abraços

GustavoLaguna
ResultSet rs = stmt.executeQuery("select max(codigo) from produtos");
		
		return rs.getInt(1);

Deve ta faltando um rs.next()?

Criado 22 de abril de 2008
Ultima resposta 25 de abr. de 2008
Respostas 13
Participantes 5