none
Recuperar chave primária (código) do último registro adicionado RRS feed

  • Pergunta

  • Olá, pessoal. A dúvida é bem besta, mas vou contar a situação direitinho para que possam, talvez, se quiserem, ajudar-me. Bem, estou fazendo uma aplicação que consiste basicamente no cadastro de pessoas. Para isso criei uma tabela Membro e uma tabela Endereco (só citei essas duas, porque a dúvida é entre elas).
    No meu aplicativo a tabela Endereco só existe "desmembrada" da tabela Membro, por uma questão de organização, e não de desempenho ou normalização. Esclarecido esse ponto, eu criei uma interface para o usuário digitar os dados do membro, inclusive o endereço; guardei esses dados em objetos dos tipos Membro e Endereco com atributos que foram espelhados do banco. Então, antes de adicionar um membro eu tenho de adicionar o Endereço, pegar a chave primária desse endereço e jogar dentro do INSERT do membro. Deu pra entender? Se sim, como fazer isso?

    PS.: poderia fazer pegando a quantidade de registros através de um SELECT na tabela Endereco? Acho que sim. Mas fora essa gambiarra, existe outro método?

    Grato desde já.  
    segunda-feira, 8 de fevereiro de 2010 05:42

Respostas

  • Olá Danilo,

    Existem algumas formas para fazer isso:

    1) Utilizar uma Stored Procedure que receba os dados do Membro e do Endereço. Na Stored Procedure você pode:

    1a) Inserir na tabela Membro, recuperar o código através da variável @@identity ou da função scope_identity() e utilizá-lo no insert da tabela de Endereço;

    1b) Inserir na tabela Membro utilizando a cláusula OUTPUT do comando INSERT que permite a você retornar um dado após o insert. No seu caso retornar o ID do Membro para utilizá-lo depois;

    2) Fazer a mesma lógica descrita anteriormente no código, garantindo que irá utilizar a mesma conexão e se possível a mesma transação (objeto com a interface IDbTransaction);

    3) Utilizar o Entity Framework que resolveria tudo isso pra você.


    []'s


    Jorge Rua http://jtressino.spaces.live.com http://twitter.com/jtressino
    • Sugerido como Resposta Jorge Rua segunda-feira, 8 de fevereiro de 2010 10:19
    • Marcado como Resposta Danilo Kleber segunda-feira, 8 de fevereiro de 2010 18:55
    segunda-feira, 8 de fevereiro de 2010 10:18

Todas as Respostas

  • Olá Danilo,

    Existem algumas formas para fazer isso:

    1) Utilizar uma Stored Procedure que receba os dados do Membro e do Endereço. Na Stored Procedure você pode:

    1a) Inserir na tabela Membro, recuperar o código através da variável @@identity ou da função scope_identity() e utilizá-lo no insert da tabela de Endereço;

    1b) Inserir na tabela Membro utilizando a cláusula OUTPUT do comando INSERT que permite a você retornar um dado após o insert. No seu caso retornar o ID do Membro para utilizá-lo depois;

    2) Fazer a mesma lógica descrita anteriormente no código, garantindo que irá utilizar a mesma conexão e se possível a mesma transação (objeto com a interface IDbTransaction);

    3) Utilizar o Entity Framework que resolveria tudo isso pra você.


    []'s


    Jorge Rua http://jtressino.spaces.live.com http://twitter.com/jtressino
    • Sugerido como Resposta Jorge Rua segunda-feira, 8 de fevereiro de 2010 10:19
    • Marcado como Resposta Danilo Kleber segunda-feira, 8 de fevereiro de 2010 18:55
    segunda-feira, 8 de fevereiro de 2010 10:18
  • Vou tentar um desses e dou retorno depois. Já agradeço pelos esclarecimentos.

    Abraço. Até mais.
    segunda-feira, 8 de fevereiro de 2010 19:37
  • Olá Danilo,

    Existem algumas formas para fazer isso:

    1) Utilizar uma Stored Procedure que receba os dados do Membro e do Endereço. Na Stored Procedure você pode:

    1a) Inserir na tabela Membro, recuperar o código através da variável @@identity ou da função scope_identity() e utilizá-lo no insert da tabela de Endereço;

    1b) Inserir na tabela Membro utilizando a cláusula OUTPUT do comando INSERT que permite a você retornar um dado após o insert. No seu caso retornar o ID do Membro para utilizá-lo depois;

    2) Fazer a mesma lógica descrita anteriormente no código, garantindo que irá utilizar a mesma conexão e se possível a mesma transação (objeto com a interface IDbTransaction);

    3) Utilizar o Entity Framework que resolveria tudo isso pra você.


    []'s


    Jorge Rua http://jtressino.spaces.live.com http://twitter.com/jtressino

    Jorge, boa tarde,

    como faço para usar o Passo 3??

    O site que estou fazendo usa EF, e é novo pra mim, pois eu usava o velho CommandText @@IDENTITY, como seria isso com EF?

    Att.

    sábado, 30 de junho de 2012 16:55
  • Olá Leonardo,

    O EF é bastante diferente das abordagens com ADO.Net puro.

    Ele é uma ferramenta de mapeamento objeto relacional, e não vai exigir que vc escreva queries em SQL.

    Qual seu conhecimento sobre EF?

    Aqui neste post existe alguns links úteis sobre o Entity Framework: http://social.msdn.microsoft.com/Forums/pt-BR/adoptpt/thread/49983a46-1acb-45ad-b68d-d7936dc7585b

    No caso, logo depois que vc executa o comando SaveChanges, o EF automaticamente atualiza os IDs para vc. Sem vc se preocupar.

    Aqui tem um exemplo sobre o uso de Entity Framework: http://ferhenriquef.com/2011/11/26/construindo-sua-camada-de-acesso-a-dados-com-o-entity-framework-4-1/

    Espero que ajude.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    domingo, 1 de julho de 2012 15:46
    Moderador