Amigo eu não sou nenhum guru do java, mas vou tentar te ajudar com o que eu ja sei…
Sobre seu método DAO de insert: pelo o que eu entendi voce esta passando uma string que contem um “select idcliente from cliente…” para o prepareStatement ler, eu nao imagino como isso possa funcionar, pra mim em hora nenhuma voce recuperou o valor do idcliente, voce apenas o encontrou e o carregou no objeto “compra”…porém não passou o id dele para o segundo select. Creio que por isso ele da o erro de violação…é minha opnião, mas como eu disse…eu estou aprendendo ainda…um exemplo tosco de como recuperar esse valor seria : “int x = compra.getIdCliente()”
E quanto a sua combobox, voce está trazendo qual valor do banco?, eu tive um problema uma vez semelhante, no qual eu solucionei implementando o toString() no meu Bean que estava sendo usado para trazer os valores…como eu trazia do objeto Bean uma variavel do tipo string, os valores listados na combo eram os valores de referencia do objeto…mas bom, pelo jeito não funcionou pra vc.
Espero ter ajudado em algo!
Abs!
como seria na sua lógica o meu método DAO de inserir compras capturando a chave primária para inserir na chave estrangeira???
???
Vo postar o meu método de listar, que busca os dados para listar no ComboBox… eu ja fiz o loop que vcs falaram, mas os dados estão vindo em forma de simbolo no ComboBox…
mas minha maior preocupação é na inserção de valores na chave estrangeira… eu queria muito mesmo uma solução… por que preciso disso para implementar no TCC da Facul
[code]public List listar() throws SQLException{
Connection conn = Conexao.getConexao();
String sql = "Select * from cliente order by nome";
PreparedStatement stmt = conn.prepareStatement(sql);
// Esse método é utilizado para apontar para os dados do BD
ResultSet rs = stmt.executeQuery();
//Cria uma lsita para armazenar os valores que serão buscados
List<Cliente> minhaLista = new ArrayList<Cliente>();
while(rs.next()){
// Essa Rotína pega os dados do banco e armazena nesse objeto do tipo contato
Cliente cliente = new Cliente(rs.getString("nome"));
cliente.setIdcliente(rs.getInt("idcliente"));
//Essa rotína adiciona os dados de contato no objeto minhaLista
minhaLista.add(cliente);
}
rs.close();
stmt.close();
return minhaLista;
}[/code]
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import teste.bean.CompraBean;
import teste.jdbc.FabricaConexao;
public class CompraDAO {
public void inserirCompra(CompraBean bean , String nome){
int idresult=0;
Connection con = FabricaConexao.getConexao();
String sql = "Select * from cliente where nome ='"+nome+"'";
try{
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next()==true){
bean.setIdcliente(rs.getInt("idcliente"));
idresult = bean.getIdcliente();
}else{
System.out.println("Cliente não encontrado");
}
rs.close();
ps.close();
}catch(SQLException e){
System.out.println("Erro de SQL");
e.printStackTrace();
}
String sql2 = "insert into compra(idcliente,produto) values("+idresult+",?)";
try {
PreparedStatement ps2 = con.prepareStatement(sql2);
ps2.setString(1, bean.getProduto());
ps2.execute();
ps2.close();
} catch (SQLException e) {
System.out.println("Erro no SQL2");
e.printStackTrace();
}
}
}
Não sei se é o jeito mais correto, mas eu testei aqui e funcionou! =)
Eu fiz rapidao aqui e nao me atentei…mas a sua classe Conexao eu chamo de FabricaConexao, e a sua classe Compra que contem os get() e set() eu chamo de CompraBean …o resto acho que voce vai entender…
Abs!
Sua lógica ta igual a minha!!! :-o
Eu fiz um teste aqui que foi o seguinte, cancelei o ComboBox e coloquei um TextFild, dentro do TextFild eu escrevia o nome da pessoa que iría comprar, e deu certo, o ID referente a pessoa foi inserido perfeitamente dentro da tabela Compras,sendo assim ,o problema é no ComboBox, que esta listando os nomes do Banco de Dados em forma de Simbolo…por que com o textfild, digitando o nome referente aos existentes no banco de dados, ele insere perfeitamente na tabela compras o ID referente ao nome do cliente na chave estrangeira…Agora tenho que resolver o problema do ComboBox, para ele listar os nomes perfeitamentes dentro dele…
Eu não disse que a lógica estava errada, só o jeito de recuperar o id do cliente e o jeito de passar ele no segundo select dentro do prepareStatement. No código que voce postou anteriormente, a sua variavel “val” era passada…mas bom…se está inserindo corretamente, vamos ao combobox…os simbolos que estão sendo mostrados, é algo nessa formatação: 13213@jdsjisidsaidji ? , manda um print ou o proprio simbolo que ta aparecendo ai…eu vou fazendo uma combo aqui para testar seu metodo listar
Um exemplo da combobox …eu testei aqui e funcionou!
private JComboBox getJComboBox1() {
if (jComboBox1 == null) {
jComboBox1 = new JComboBox();
jComboBox1.setBounds(new Rectangle(9, 58, 214, 25));
ClienteDAO dao = new ClienteDAO();
List<ClienteBean> lista2 = new ArrayList<ClienteBean>();
try {
lista2 = dao.listar();
for (ClienteBean clienteBean : lista2) {
jComboBox1.addItem(clienteBean.getNome());
}
} catch (SQLException e) {
System.out.println("ERRO NA LISTAGEM");
e.printStackTrace();
}
}
return jComboBox1;
}
Com esse metodo que retorna uma combo, é só voce dar um add() no seu JPanel que funciona, ex: jMeuPainel.add(getJComboBox1());
Testa ai e ve se funciona!
Abs!
Ai mano, eu tava analisando seu codigo de ComboBox e vi o que tinha de errado no meu…
quando eu estava chamando a função do combo box estava assim --> cbox.additem(Cli)
mas pelo que eu vi no seu código eu tinha esquecido de chamar o método getNome()… e o certo era --> cbox.additem(Cli.getNome())…
Obrigado por ter postado seu Método de ComboBox ail me ajudou a achar o meu erro!!! Vlw de coração´…
Amigo se vc ta com problemas
vc pode inserir diretamento do Form
Te mandarei um exemplo pra que de uma olhada
Certo.Até mais qualquer duvida so mandar.
[quote=fgs4ntos]Amigo se vc ta com problemas
vc pode inserir diretamento do Form
Te mandarei um exemplo pra que de uma olhada
Certo.Até mais qualquer duvida so mandar.
Você ressuscita um tópico após mais de 5 meses do autor ter resolvido, e ainda aconselha o autor a usar Statement no lugar de PreparedStatement?
Tomara que ninguém chamado “Irv’s” use o seu banco, muito menos se o endereço dele for ao lado do “John Pub’s”. Seu SQL vai falhar de cara se isso ocorrer. Dá uma lida sobre preparedstatement, livre-se daquelas concatenações, evite esse erro e, de quebra, deixe seu sistema seguro contra SQL Injection.