none
Inserir dados em uma tabela, pegar a ID da mesma e usar com FK em outra. RRS feed

  • Pergunta

  •   Galera, to ralando aqui e quando pensei ter conseguido, infelizmente ainda não deu certo minha rotina.

      Bem, eu tenho 2 tabelas: Tab_Endereco e Tab_Funcionario:

    Eu preciso da FK_Id_Endereco para cadastrar meu funcionário. O problema é: Eu consigo pegar uma Id, porém, ela não bate com a ID Registrada!!

    Segue o código, por favor, me ajudem... É para um trabalho da facul e ainda estou engatinhando em ADO.NET xS

     //Variaveis
            nome = txtNome.Text;
            sobrenome = txtSobrenome.Text;
            cpf = txtCPF.Text;
            Login = txtCadastrarLogin.Text;
            Senha = txtCadastrarSenha.Text;
            logradouro = txtEndereco.Text;
            numero = txtNumero.Text;
            complemento = txtComplemento.Text;
            cidade = txtCidade.Text;
            uf = dpdListEstado.Text;
            ADM = dpdTpCadastro.Text;
    
            // COMANDO SQL PARA INSERIR O ENDEREÇO
            // NOTA, O ENDEREÇO DEVE SER CARREGADO ANTES PARA GERAR FK_iD_ENDERECO ;)
            cmdInserEnd = @"INSERT INTO Tab_Endereco(Logradouro, Numero,  Cidade, Estado)
          VALUES (@Logradouro, @Numero,  @Cidade, @Estado)";
            // COMANDO SQL PARA INSERIR DADOS NA TABELA FUNCIONÁRIO
            cmdInserFunc = @"insert into Tab_Funcionario (Nome, Sobrenome, CPF, Id_Endereco, Login,Senha,ADM)
          VALUES (@Nome, @Sobrenome, @CPF, @Id_Endereco, @Login, @Senha, @ADM)";
    
            strConn = ConfigurationManager.ConnectionStrings["infomais"].ConnectionString;
    
            // INSTANCIA A STRCONN, CRIANDO UMA STRING PARA EXECUTAR A CONEXÃO
            conn = new SqlConnection(strConn);
    
            // CRIA O "COMMAND" PARA INSERIR OS DADOS NA TABELA ENDEREÇO
            cmd = new SqlCommand(cmdInserEnd, conn);
    
            // ABRE A CONEXÃO COM O BANCO DE DADOS
            conn.Open();
    
            // DEFINE OS PARAMETROS
            cmd.Parameters.AddWithValue("@Logradouro", logradouro);
            cmd.Parameters.AddWithValue("@Numero", numero);
            cmd.Parameters.AddWithValue("@Cidade", cidade);
            cmd.Parameters.AddWithValue("@Estado", uf);
    
            //EXECUTA OS PARAMETROS :)
            cmd.ExecuteNonQuery();
    
            //SELECIONA A ULTIMA ID NA TABELA
            string NovoId = @"Select IDENT_CURRENT ('Tab_Funcionario') From Tab_Endereco";
            // COMANDO DA ID
            cmd = new SqlCommand(NovoId, conn);
    
            // PEGA ID DA TAB_ENDERECO
            IdRetorno = Convert.ToString(cmd.ExecuteScalar());
    
            // COMANDO PARA INSERIR DADOS NA TAB_FUNCIONARIO
            cmd2 = new SqlCommand(cmdInserFunc, conn);
            // PARAMETROS DA TABELA DE FUNCIONARIOS
            cmd2.Parameters.AddWithValue("@Nome", nome);
            cmd2.Parameters.AddWithValue("@Sobrenome", sobrenome);
            cmd2.Parameters.AddWithValue("@CPF", cpf);
            cmd2.Parameters.AddWithValue("@Login", Login);
            cmd2.Parameters.AddWithValue("@Senha", Senha);
            cmd2.Parameters.AddWithValue("@ADM", ADM);
            cmd2.Parameters.AddWithValue("@Id_Endereco", IdRetorno);
            // EXECUTA OS COMANDOS DA TABELA DE FUNCIONARIOS.
            cmd2.ExecuteNonQuery();
    
            ltlMensagem.Text = "Usuário Cadastrado - Seja Bem-vindo!";
            }


    Assunto = dúvida

    terça-feira, 23 de outubro de 2012 18:48

Respostas

  • Claudio,

    Tente usar da função SCOPE_IDENTITY do SQL para recuperar o ultimo id da tabela que sofreu uma inserção no contexto atual, por exemplo:

    // Variaveis
    nome = txtNome.Text;
    sobrenome = txtSobrenome.Text;
    cpf = txtCPF.Text;
    Login = txtCadastrarLogin.Text;
    Senha = txtCadastrarSenha.Text;
    logradouro = txtEndereco.Text;
    numero = txtNumero.Text;
    complemento = txtComplemento.Text;
    cidade = txtCidade.Text;
    uf = dpdListEstado.Text;
    ADM = dpdTpCadastro.Text;
    
    // COMANDO SQL PARA INSERIR O ENDEREÇO
    // NOTA, O ENDEREÇO DEVE SER CARREGADO ANTES PARA GERAR FK_iD_ENDERECO ;)
    cmdInserEnd = @"INSERT INTO Tab_Endereco(Logradouro, Numero,  Cidade, Estado)
    VALUES (@Logradouro, @Numero,  @Cidade, @Estado); GO SELECT SCOPE_IDENTITY()";
    // COMANDO SQL PARA INSERIR DADOS NA TABELA FUNCIONÁRIO
    cmdInserFunc = @"insert into Tab_Funcionario (Nome, Sobrenome, CPF, Id_Endereco, Login,Senha,ADM)
    VALUES (@Nome, @Sobrenome, @CPF, @Id_Endereco, @Login, @Senha, @ADM)";
    
    strConn = ConfigurationManager.ConnectionStrings["infomais"].ConnectionString;
    
    // INSTANCIA A STRCONN, CRIANDO UMA STRING PARA EXECUTAR A CONEXÃO
    conn = new SqlConnection(strConn);
    
    // CRIA O "COMMAND" PARA INSERIR OS DADOS NA TABELA ENDEREÇO
    cmd = new SqlCommand(cmdInserEnd, conn);
    
    // ABRE A CONEXÃO COM O BANCO DE DADOS
    conn.Open();
    
    // DEFINE OS PARAMETROS
    cmd.Parameters.AddWithValue("@Logradouro", logradouro);
    cmd.Parameters.AddWithValue("@Numero", numero);
    cmd.Parameters.AddWithValue("@Cidade", cidade);
    cmd.Parameters.AddWithValue("@Estado", uf);
    
    //EXECUTA OS PARAMETROS :)
    //E RECUPERAR ID APOS INSERÇÃO
    IdRetorno = cmd.ExecuteScalar().ToString();       
    
    // COMANDO PARA INSERIR DADOS NA TAB_FUNCIONARIO
    cmd2 = new SqlCommand(cmdInserFunc, conn);
    // PARAMETROS DA TABELA DE FUNCIONARIOS
    cmd2.Parameters.AddWithValue("@Nome", nome);
    cmd2.Parameters.AddWithValue("@Sobrenome", sobrenome);
    cmd2.Parameters.AddWithValue("@CPF", cpf);
    cmd2.Parameters.AddWithValue("@Login", Login);
    cmd2.Parameters.AddWithValue("@Senha", Senha);
    cmd2.Parameters.AddWithValue("@ADM", ADM);
    cmd2.Parameters.AddWithValue("@Id_Endereco", int.Parse(IdRetorno));
    // EXECUTA OS COMANDOS DA TABELA DE FUNCIONARIOS.
    cmd2.ExecuteNonQuery();
    
    ltlMensagem.Text = "Usuário Cadastrado - Seja Bem-vindo!";




    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Editado Vitor Mendes terça-feira, 23 de outubro de 2012 19:51
    • Marcado como Resposta Claudio 007-006 quarta-feira, 24 de outubro de 2012 19:00
    terça-feira, 23 de outubro de 2012 19:50

Todas as Respostas

  • Detalhe: Eu desliguei a função "Impor Restrição de chave Estrangeira", pois não conseguia realizar a operação com essa opção ligada.

    Assunto = dúvida

    terça-feira, 23 de outubro de 2012 18:50
  • Claudio,

    Tente usar da função SCOPE_IDENTITY do SQL para recuperar o ultimo id da tabela que sofreu uma inserção no contexto atual, por exemplo:

    // Variaveis
    nome = txtNome.Text;
    sobrenome = txtSobrenome.Text;
    cpf = txtCPF.Text;
    Login = txtCadastrarLogin.Text;
    Senha = txtCadastrarSenha.Text;
    logradouro = txtEndereco.Text;
    numero = txtNumero.Text;
    complemento = txtComplemento.Text;
    cidade = txtCidade.Text;
    uf = dpdListEstado.Text;
    ADM = dpdTpCadastro.Text;
    
    // COMANDO SQL PARA INSERIR O ENDEREÇO
    // NOTA, O ENDEREÇO DEVE SER CARREGADO ANTES PARA GERAR FK_iD_ENDERECO ;)
    cmdInserEnd = @"INSERT INTO Tab_Endereco(Logradouro, Numero,  Cidade, Estado)
    VALUES (@Logradouro, @Numero,  @Cidade, @Estado); GO SELECT SCOPE_IDENTITY()";
    // COMANDO SQL PARA INSERIR DADOS NA TABELA FUNCIONÁRIO
    cmdInserFunc = @"insert into Tab_Funcionario (Nome, Sobrenome, CPF, Id_Endereco, Login,Senha,ADM)
    VALUES (@Nome, @Sobrenome, @CPF, @Id_Endereco, @Login, @Senha, @ADM)";
    
    strConn = ConfigurationManager.ConnectionStrings["infomais"].ConnectionString;
    
    // INSTANCIA A STRCONN, CRIANDO UMA STRING PARA EXECUTAR A CONEXÃO
    conn = new SqlConnection(strConn);
    
    // CRIA O "COMMAND" PARA INSERIR OS DADOS NA TABELA ENDEREÇO
    cmd = new SqlCommand(cmdInserEnd, conn);
    
    // ABRE A CONEXÃO COM O BANCO DE DADOS
    conn.Open();
    
    // DEFINE OS PARAMETROS
    cmd.Parameters.AddWithValue("@Logradouro", logradouro);
    cmd.Parameters.AddWithValue("@Numero", numero);
    cmd.Parameters.AddWithValue("@Cidade", cidade);
    cmd.Parameters.AddWithValue("@Estado", uf);
    
    //EXECUTA OS PARAMETROS :)
    //E RECUPERAR ID APOS INSERÇÃO
    IdRetorno = cmd.ExecuteScalar().ToString();       
    
    // COMANDO PARA INSERIR DADOS NA TAB_FUNCIONARIO
    cmd2 = new SqlCommand(cmdInserFunc, conn);
    // PARAMETROS DA TABELA DE FUNCIONARIOS
    cmd2.Parameters.AddWithValue("@Nome", nome);
    cmd2.Parameters.AddWithValue("@Sobrenome", sobrenome);
    cmd2.Parameters.AddWithValue("@CPF", cpf);
    cmd2.Parameters.AddWithValue("@Login", Login);
    cmd2.Parameters.AddWithValue("@Senha", Senha);
    cmd2.Parameters.AddWithValue("@ADM", ADM);
    cmd2.Parameters.AddWithValue("@Id_Endereco", int.Parse(IdRetorno));
    // EXECUTA OS COMANDOS DA TABELA DE FUNCIONARIOS.
    cmd2.ExecuteNonQuery();
    
    ltlMensagem.Text = "Usuário Cadastrado - Seja Bem-vindo!";




    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Editado Vitor Mendes terça-feira, 23 de outubro de 2012 19:51
    • Marcado como Resposta Claudio 007-006 quarta-feira, 24 de outubro de 2012 19:00
    terça-feira, 23 de outubro de 2012 19:50