none
Retornar chave primária identity RRS feed

  • Pergunta

  • Olá pessoal do fórum,

    Gostaria de perguntar-lhes como eu faria para retornar uma chave primária auto-numérica de uma tabela (TAB_ALUNOS) e inserir em uma outra tabela (TAB_VOTOS), sendo que esta está relacionada com o campo COD_ALUNO (chave primária de TAB_ALUNOS). No caso, quando o aluno se logasse, colocando seu nome e cpf, haveria uma consulta na StoredProcedure com o seguinte comando:

    ALTER PROCEDURE [dbo].[SP_RetornaCODAluno]
    (

        @CPF varchar(20)
    )

    AS

    SELECT COD_ALUNO FROM Tbl_Aluno WHERE CPF=@CPF


    Dessa forma, ao inserir o aluno em uma outra StoredProcedure, COD_ALUNO está setado como @COD_ALUNO= SCOPE_IDENTITY.

    Ao desenvolver o método de consulta do COD_Aluno, ele possuia o parâmetro CPF para ser identificado na instrução Select e retornava COD_ALUNO, conforma o cógigo abaixo:

    public string DBValidaCODAluno(string CPF)
            {

                this._CPF = CPF;

                SqlParameter[] parms = {
                    new SqlParameter("@CPF",SqlDbType.VarChar,20)
                };

                parms[0].Value = this._CPF;

                DataBaseReader dr = new DataBaseReader();
                SqlDataReader datareader = dr.ExecuteReader(CommandType.StoredProcedure, "SP_RetornaCODAluno", parms);

                datareader.Read();

                return this._NumMatricula;
            }


    Vcs acham que devo setar como parâmetro COD_ALUNO para inserí-lo em TAB_VOTOS? Bem, tentei fazer dessas duas formas e o método retornou NULO.

    O que posso fazer neste caso?



    sexta-feira, 13 de novembro de 2009 14:45

Respostas

  • Oi Natália,

    Cuidado com o @@IDENTITY, pois ele nem sempre vai retornar o identity da tabela que você deseja. Se estiveres usando SQL 2005 pode utilizar essa função
    aqui:

    SELECT IDENT_CURRENT('TABELA')
    Eu te aconselho a fazer tudo dentro de uma mesma procedure, acredito que vá facilitar tua vida. Cria uma procedure que adiciona os alunos na tabela de votos passando o CPF e tu busca dentro da procedure. Ou então guarda esse valor em algum lugar no teu sistema (session por exemplo).

    Para executar a procedure, que vai retornar o código apenas, tu podes usar o ExecuteScalar do SqlCommand, esse cara te retorna um valor único que no teu caso pode ser o código.

    Espero que tenha ajudado.

    Abraços,
    Rafael Cruz
    segunda-feira, 16 de novembro de 2009 13:25
  • Quanto você tiver acabado de inserir o registro você pode pegar o identificador
    atraves do identity (para retornar  o identificador da tabela). Aconselho a verificar as linhas afetadas ou se ouve erros

    Se tiver tudo bacana pegue pelo Identity mesmo após o cadastro. Outra coisa é colocar
    o parametro como Output.

    agora se o registro já existe pegue pelo CPF mesmo

    select cod_aluno from aluno where cpf = @cpf

     

    Com relação a tabela de votos, um outro cenario seria passar o cpf como parametro e internamente recuperar o identificador do cpf. Se existir você continua fazendo o que precisa...se não, não faz nada


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    sábado, 17 de setembro de 2011 12:20

Todas as Respostas

  • Fale,

     

     

    SELECT @COD_ALUNO = @@Identity

    select COD_ALUNO from nome_tabela where COD_ALUNO = @COD_ALUNO

     

     

    Abraço!


    Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!
    sexta-feira, 13 de novembro de 2009 14:57
  • oLÁ Erysson,

     @@Identity não retorna o ID do último campo na tabela? No caso, gostaria de armazenar o ID de um aluno de acordo com  CPF do mesmo, sendo este um outro campo que identifica o aluno na tabela.

    Pela instrução que vc colocou:

    ALTER PROCEDURE [dbo].[SP_RetornaCODAluno]
    (
        @COD_ALUNO int OUTPUT,
        @CPF varchar(20)
    )

    AS
    SELECT @COD_ALUNO = @@Identity
    SELECT COD_ALUNO FROM Tbl_Aluno WHERE CPF=@CPF



    Ficaria desta maneira???
    segunda-feira, 16 de novembro de 2009 10:43
  • Oi Natália,

    Cuidado com o @@IDENTITY, pois ele nem sempre vai retornar o identity da tabela que você deseja. Se estiveres usando SQL 2005 pode utilizar essa função
    aqui:

    SELECT IDENT_CURRENT('TABELA')
    Eu te aconselho a fazer tudo dentro de uma mesma procedure, acredito que vá facilitar tua vida. Cria uma procedure que adiciona os alunos na tabela de votos passando o CPF e tu busca dentro da procedure. Ou então guarda esse valor em algum lugar no teu sistema (session por exemplo).

    Para executar a procedure, que vai retornar o código apenas, tu podes usar o ExecuteScalar do SqlCommand, esse cara te retorna um valor único que no teu caso pode ser o código.

    Espero que tenha ajudado.

    Abraços,
    Rafael Cruz
    segunda-feira, 16 de novembro de 2009 13:25
  • Quanto você tiver acabado de inserir o registro você pode pegar o identificador
    atraves do identity (para retornar  o identificador da tabela). Aconselho a verificar as linhas afetadas ou se ouve erros

    Se tiver tudo bacana pegue pelo Identity mesmo após o cadastro. Outra coisa é colocar
    o parametro como Output.

    agora se o registro já existe pegue pelo CPF mesmo

    select cod_aluno from aluno where cpf = @cpf

     

    Com relação a tabela de votos, um outro cenario seria passar o cpf como parametro e internamente recuperar o identificador do cpf. Se existir você continua fazendo o que precisa...se não, não faz nada


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    sábado, 17 de setembro de 2011 12:20