Inserindo em duas tabelas

1 resposta
ttelsen

Pessoal estou com a seguinte situação:
tenho uma tabela cliente e outra compra. onde um cliente cadastrado realizará compras. Logo cada compra deve ter um ID de um cliente. Sei que isso pode ser básico para muitos aqui, mas agradeço a força.

Me baseando por outro tópico qui do fórum meu código ficou assim:

public void inserir(ClienteBean cliente, CompraBean compra) {
		int idresult = 0;
		String sql = "insert into cliente (nome) values(?)";
		try {
			if (conn == null) {
				JOptionPane.showMessageDialog(null, "BD nao encontrado");
			} else {
				ps = conn.prepareStatement(sql,
						PreparedStatement.RETURN_GENERATED_KEYS);
				ps.setString(1, cliente.getNomeCliente());
				rs = ps.getGeneratedKeys();
				
				int lastIsertedId = rs.getInt(cliente.getIdCliente());
				compra.setIdcliente(lastIsertedId);
				idresult = compra.getIdcliente();
				rs.close();
				ps.close();
			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			System.out.println("Erro no primeiro Bloco");
		}

		String sql2 = "insert into compra(idcliente,produto) values("
				+ idresult + ",?)";
		try {
			PreparedStatement ps2 = conn.prepareStatement(sql2);
			ps2.setString(1, "idcliente");
			ps2.execute();
			ps2.close();
		} catch (SQLException e) {
			System.out.println("Erro no SQL2" + e);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClienteBean cliente = new ClienteBean();
		cliente.setNomeCliente("TERCIO");
		CompraBean compra = new CompraBean();
		compra.setProduto("CARRO");
		new ClienteDAO().inserir(cliente, compra);

	}

}

Porém tenho o seguinte erro

java.sql.SQLException: Illegal operation on empty result set.
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
	at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2674)
	at ClienteDAO.inserir(ClienteDAO.java:36)
	at ClienteDAO.main(ClienteDAO.java:67)

1 Resposta

R

ttelsen:
Pessoal estou com a seguinte situação:
tenho uma tabela cliente e outra compra. onde um cliente cadastrado realizará compras. Logo cada compra deve ter um ID de um cliente. Sei que isso pode ser básico para muitos aqui, mas agradeço a força.

Me baseando por outro tópico qui do fórum meu código ficou assim:

public void inserir(ClienteBean cliente, CompraBean compra) {
		int idresult = 0;
		String sql = "insert into cliente (nome) values(?)";
		try {
			if (conn == null) {
				JOptionPane.showMessageDialog(null, "BD nao encontrado");
			} else {
				ps = conn.prepareStatement(sql,
						PreparedStatement.RETURN_GENERATED_KEYS);
				ps.setString(1, cliente.getNomeCliente());
				rs = ps.getGeneratedKeys();
				
				int lastIsertedId = rs.getInt(cliente.getIdCliente());
				compra.setIdcliente(lastIsertedId);
				idresult = compra.getIdcliente();
				rs.close();
				ps.close();
			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			System.out.println("Erro no primeiro Bloco");
		}

		String sql2 = "insert into compra(idcliente,produto) values("
				+ idresult + ",?)";
		try {
			PreparedStatement ps2 = conn.prepareStatement(sql2);
			ps2.setString(1, "idcliente");
			ps2.execute();
			ps2.close();
		} catch (SQLException e) {
			System.out.println("Erro no SQL2" + e);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClienteBean cliente = new ClienteBean();
		cliente.setNomeCliente("TERCIO");
		CompraBean compra = new CompraBean();
		compra.setProduto("CARRO");
		new ClienteDAO().inserir(cliente, compra);

	}

}

Porém tenho o seguinte erro

java.sql.SQLException: Illegal operation on empty result set. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2674) at ClienteDAO.inserir(ClienteDAO.java:36) at ClienteDAO.main(ClienteDAO.java:67)

Existem outras formas de se fazer isso aí… vou postar uma outra aqui.

Você pode criar um método para buscar o último ID cadastrado no banco… aí você faz a ligação…
Veja o exemplo abaixo que eu fiz aqui…

[i][color=red]No seu DAO:[/color][/i]

public void cadastrarContrato(Contrato c) throws Exception {

		open();
		stmt = con.prepareStatement("insert into contrato values(null,?,?,?)");
		stmt.setString(1, c.getContrato());
		stmt.setString(2, c.getEmpresaContratada());
		stmt.setString(3, c.getCnpjEmpresaContratada());
		stmt.execute();
		stmt.close();
		close();

	}

	public Integer findByMax() throws Exception {

		open();
		Integer idContrato = null;
		stmt = con
				.prepareStatement("select max(idContrato) as maximo from contrato");
		rs = stmt.executeQuery();

		if (rs.next()) {

			idContrato = rs.getInt("maximo");

		}

		close();
		return idContrato;
	}

Um contrato pode ter vários Fiscais… Igual um cliente pode ter vários produtos.
segue abaixo o DAO do Fiscal:
Você passa o ID do contrato por parâmetro.

public void cadastrarFiscal(Fiscal f, Integer idContrato) throws Exception {

		open();
		stmt = con
				.prepareStatement("insert into fiscalContrato values(null,?,?,?)");
		stmt.setString(1, f.getMatricula());
		stmt.setString(2, f.getNome());
		stmt.setInt(3, idContrato);
		stmt.execute();
		stmt.close();
		close();
	}

Abaixo o Servlet - Controle que chama o método de cadastro:

Contrato c = new Contrato(null, request.getParameter("contrato"),
				request.getParameter("empresaContratada"),
				request.getParameter("cnpjEmpresaContratada"));

Fiscal f1 = new Fiscal(null,request.getParameter("nomeFiscal1"));
Fiscal f2 = new Fiscal(null,request.getParameter("nomeFiscal2"));

try{
      ContratoDao cd = new ContratoDao();
      FiscalDao fd = new FiscalDao();

     cd.cadastrarContrato(c);

     Integer idContrato = cd.findByMax(); 

    fd.cadastrarFiscal(f1, idContrato);
    fd.cadastrarFiscal(f2, idContrato);



}catch(Exception e){
      e.printStackTrace();
}

É uma forma diferente de se fazer…

qualquer coisa tamo aew… abraços.!

Criado 26 de julho de 2012
Ultima resposta 26 de jul. de 2012
Respostas 1
Participantes 2