none
Chave estrangeira não recebe valor C#(WPF) RRS feed

  • Pergunta

  • Linguagem: C#

    Plataforma: WPF

    Banco de Dados e versão: Mysql 5.6.17 - Mysql WorkBench

    Visual Studio: 2012

     Bom, estou desenvolvendo pela primeira vez um software de orçamento, onde o usuário do sistema irá cadastrar um cliente passando suas informações como nome,telefone, cidade, rua, etc.

     Essas informações tem que ser adicionadas ao banco de dados, onde criei para essa situação, duas tabelas:

    A tabela Cliente com as informações do cliente e a tabela Endereço, ou seja um cliente pode ter mais de um endereço.

    Veja a seguir a tabela:

    /*
     * TABELA CLIENTE
     *                         NULL:
    id_cliente	    int(11)	     NO	 PK		auto_increment
    primeiro_nome	varchar(45)	 NO			
    sobrenome	    varchar(45)	 NO			
    primeiro_tel	varchar(45)	 NO			
    segundo_tel	    varchar(45)	YES			
    email	        varchar(45)	YES		
     * 
     * TABELA ENDERECO
     *                      NULL:
    id_endereco	int(11)  	 NO	 PK		auto_increment
    id_cliente	int(11) 	 NO	 FK		
    rua	        varchar(45)	 NO			
    referencia	varchar(45)	YES			
    cep	        varchar(45)	YES			
    numero	    int(11)	    YES			
    cidade	    varchar(45)	YES			
    
    */

    A chave estrangeira da tabela Endereco chamada de id_cliente tem que receber o valor do id_cliente da tabela Cliente.

    Mas a mesma não recebe o valor.

    Na construção do meu código, eu consigo fazer com que o cliente seja gravado no banco, mas o endereço nada é gravado, fica tudo vazio vejam o meu código:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MySql.Data.MySqlClient;
    using MySql.Data;
    
    namespace SysOrc_1._0
    {
        class comandosBD
        {
            private MySqlConnection conexao;
            
    
    
            string caminho = "SERVER=localhost;DATABASE=dbDistak;UID=root;PASSWORD=1234;";
    
    
            //===================================CADASTRO CLIENTE E ENDEREÇO===================================
    
            public void cadastrar(Cliente cli, Endereco end)
            {
    
                try
                {
                    conexao = new MySqlConnection(caminho);
                    MySqlCommand comandos = new MySqlCommand();
                    conexao.Open();
    
                    string inserirCliente = "INSERT INTO Cliente(primeiro_nome,sobrenome,primeiro_tel,segundo_tel,email) values(@nome,@sobrenome,@tel1,@tel2,@email);SELECT LAST_INSERT_ID();";
                    comandos.Parameters.AddWithValue("@nome",cli.GetSetNomeCliente);
                    comandos.Parameters.AddWithValue("@sobrenome",cli.GetSetSobrenomeCliente);
                    comandos.Parameters.AddWithValue("@tel1", cli.GetSetTel1);
                    comandos.Parameters.AddWithValue("@tel2", cli.GetSetTel2);
                    comandos.Parameters.AddWithValue("@email", cli.GetSetEmailCliente);
    
    
                    
                    comandos.Connection = conexao;
                    comandos.CommandText = inserirCliente;
                    int idRetorno = Convert.ToInt32(comandos.ExecuteScalar());
                    comandos.Parameters.AddWithValue("@idCliente", idRetorno);
                    Console.WriteLine("ESSA E A ID RETORNADA " + idRetorno); //Só pra ver que numero retorna e realmente está retornando o numero.
    
                    //-------------------------------Endereco-----------------------------------------
    
                   string inserirEndereco = "INSERT INTO Endereco(id_cliente,rua,referencia,cep,numero,cidade) values(@idCliente,@endereco,@referencia,@cep,@numero,@cidade);";
                   
                   comandos.Parameters.AddWithValue("@endereco", end.GetSetEnderecoCliente);
                   comandos.Parameters.AddWithValue("@referencia", end.GetSetReferenciaCliente);
                   comandos.Parameters.AddWithValue("@cep", end.GetSetCep);
                   comandos.Parameters.AddWithValue("@numero", end.GetSetNumeroCliente);
                   comandos.Parameters.AddWithValue("@cidade", end.GetSetCidade);
                   comandos.Connection = conexao;
                   comandos.CommandText = inserirEndereco;
                   
                    
    
                    conexao.Close();
                }
                catch (Exception ex)
                {
    
                    throw new Exception("Erro de comandos: " + ex.Message);
                }
    
            }

    Já vi varios tópicos a respeito, e consegui resolver muita coisa, mas essa está me dando dor de cabeça, não consigo resolver nem a pau.

     Aqui está o código em SQL do banco:

    -- MySQL Script generated by MySQL Workbench
    -- 04/15/14 15:33:51
    -- Model: New Model    Version: 1.0
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
    
    -- -----------------------------------------------------
    -- Schema dbDistak
    -- -----------------------------------------------------
    DROP SCHEMA IF EXISTS `dbDistak` ;
    CREATE SCHEMA IF NOT EXISTS `dbDistak` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `dbDistak` ;
    
    -- -----------------------------------------------------
    -- Table `dbDistak`.`Cliente`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `dbDistak`.`Cliente` ;
    
    CREATE TABLE IF NOT EXISTS `dbDistak`.`Cliente` (
      `id_cliente` INT NOT NULL AUTO_INCREMENT,
      `primeiro_nome` VARCHAR(45) NOT NULL,
      `sobrenome` VARCHAR(45) NOT NULL,
      `primeiro_tel` VARCHAR(45) NOT NULL,
      `segundo_tel` VARCHAR(45) NULL,
      `email` VARCHAR(45) NULL,
      PRIMARY KEY (`id_cliente`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `dbDistak`.`ValoresOp`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `dbDistak`.`ValoresOp` ;
    
    CREATE TABLE IF NOT EXISTS `dbDistak`.`ValoresOp` (
      `id_valop` INT NOT NULL AUTO_INCREMENT,
      `v_maodeobra` DOUBLE NOT NULL,
      `v_acabamento` DOUBLE NOT NULL,
      `v_colagem` DOUBLE NOT NULL,
      PRIMARY KEY (`id_valop`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `dbDistak`.`Orcamento`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `dbDistak`.`Orcamento` ;
    
    CREATE TABLE IF NOT EXISTS `dbDistak`.`Orcamento` (
      `id_orcamento` INT NOT NULL AUTO_INCREMENT,
      `id_cliente` INT NOT NULL,
      `id_valop` INT NOT NULL,
      `tipo_local` VARCHAR(45) NULL,
      `largura` DOUBLE NOT NULL,
      `comprimento` DOUBLE NOT NULL,
      PRIMARY KEY (`id_orcamento`),
      INDEX `fk_Orcamento_Cliente1_idx` (`id_cliente` ASC),
      INDEX `id_valop_idx` (`id_valop` ASC),
      CONSTRAINT `fk_Orcamento_Cliente1`
        FOREIGN KEY (`id_cliente`)
        REFERENCES `dbDistak`.`Cliente` (`id_cliente`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `id_valop`
        FOREIGN KEY (`id_valop`)
        REFERENCES `dbDistak`.`ValoresOp` (`id_valop`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `dbDistak`.`Endereco`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `dbDistak`.`Endereco` ;
    
    CREATE TABLE IF NOT EXISTS `dbDistak`.`Endereco` (
      `id_endereco` INT NOT NULL AUTO_INCREMENT,
      `id_cliente` INT NOT NULL,
      `rua` VARCHAR(45) NOT NULL,
      `referencia` VARCHAR(45) NULL,
      `cep` VARCHAR(45) NULL,
      `numero` INT NULL,
      `cidade` VARCHAR(45) NULL,
      PRIMARY KEY (`id_endereco`),
      INDEX `Cliente_id` (`id_cliente` ASC),
      CONSTRAINT `id_cliente`
        FOREIGN KEY (`id_cliente`)
        REFERENCES `dbDistak`.`Cliente` (`id_cliente`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `dbDistak`.`Item`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `dbDistak`.`Item` ;
    
    CREATE TABLE IF NOT EXISTS `dbDistak`.`Item` (
      `id_item` INT NOT NULL AUTO_INCREMENT,
      `id_orcamento` INT NOT NULL,
      `preco_m2` DOUBLE NOT NULL,
      `espessura` DOUBLE NOT NULL,
      `cor` INT NOT NULL,
      `nome_material` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id_item`),
      INDEX `Id_orcamento_idx` (`id_orcamento` ASC),
      CONSTRAINT `Id_orcamento`
        FOREIGN KEY (`id_orcamento`)
        REFERENCES `dbDistak`.`Orcamento` (`id_orcamento`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `dbDistak`.`Administrador`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `dbDistak`.`Administrador` ;
    
    CREATE TABLE IF NOT EXISTS `dbDistak`.`Administrador` (
      `id_administrador` INT NOT NULL AUTO_INCREMENT,
      `login` VARCHAR(45) NOT NULL,
      `senha` VARCHAR(45) NULL,
      PRIMARY KEY (`id_administrador`))
    ENGINE = InnoDB;
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    



    terça-feira, 15 de abril de 2014 18:34

Respostas

  • Gabriel, faltou vc executar sua segunda query, em qual lugar vc faz o ExecuteNonQuery() de Endereço, falta isso :

    //-------------------------------Endereco-----------------------------------------
    
                   string inserirEndereco = "INSERT INTO Endereco(id_cliente,rua,referencia,cep,numero,cidade) values(@idCliente,@endereco,@referencia,@cep,@numero,@cidade);";
                   
                   comandos.Parameters.AddWithValue("@endereco", end.GetSetEnderecoCliente);
                   comandos.Parameters.AddWithValue("@referencia", end.GetSetReferenciaCliente);
                   comandos.Parameters.AddWithValue("@cep", end.GetSetCep);
                   comandos.Parameters.AddWithValue("@numero", end.GetSetNumeroCliente);
                   comandos.Parameters.AddWithValue("@cidade", end.GetSetCidade);
                   comandos.Connection = conexao;
                   comandos.CommandText = inserirEndereco;
                   
                    //INSIRA ESSA LINHA
                    comandos.ExecuteNonQuery();
    
                    conexao.Close();

    terça-feira, 15 de abril de 2014 19:21

Todas as Respostas

  • Gabriel, faltou vc executar sua segunda query, em qual lugar vc faz o ExecuteNonQuery() de Endereço, falta isso :

    //-------------------------------Endereco-----------------------------------------
    
                   string inserirEndereco = "INSERT INTO Endereco(id_cliente,rua,referencia,cep,numero,cidade) values(@idCliente,@endereco,@referencia,@cep,@numero,@cidade);";
                   
                   comandos.Parameters.AddWithValue("@endereco", end.GetSetEnderecoCliente);
                   comandos.Parameters.AddWithValue("@referencia", end.GetSetReferenciaCliente);
                   comandos.Parameters.AddWithValue("@cep", end.GetSetCep);
                   comandos.Parameters.AddWithValue("@numero", end.GetSetNumeroCliente);
                   comandos.Parameters.AddWithValue("@cidade", end.GetSetCidade);
                   comandos.Connection = conexao;
                   comandos.CommandText = inserirEndereco;
                   
                    //INSIRA ESSA LINHA
                    comandos.ExecuteNonQuery();
    
                    conexao.Close();

    terça-feira, 15 de abril de 2014 19:21
  •  Funcionou, cara que absurdo, Faz semanas que estava travado nisso, tentei varias coisas possíveis, o que pegou foi o fato de ser o meu primeiro contato com o banco de dados, e comandos Mysql, mas foi de grande ajuda ter postado aqui, consegui resolver inserindo o que você me passou, muito obrigado mesmo cara, de coração.
    terça-feira, 15 de abril de 2014 20:26