none
Recuperar @@Identity no Form RRS feed

  • Pergunta

  • Galera como faço para recuperar o ID que acaba de ser feito no Insert? Vi que é algo com o @@Identity, mas eu trabalho com classes e não faço ideia de como recuperar esse valor lá na aplicação.

    Vejam parte da minha classe c#

    public int Gravar()
            {
                int retorno;
                Cmd.CommandText = @"INSERT INTO AGENDA (AGENDA_ID, AGENDA_MAT_PRESO, AGENDA_NOME_PRESO, AGENDA_SOLICITADO_POR, AGENDA_INTERESSADO, AGENDA_BENEFICIO,
                                                        AGENDA_PEDIDO, AGENDA_EMITIR_EM, AGENDA_PARA, AGENDA_STATUS, AGENDA_EXCLUSAO, AGENDA_EXECUCAO, AGENDA_PROCESSO)
                                                 VALUES (GEN_ID(GEN_AGENDA_ID,1), @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
                                                        @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO) SELECT @@Identity";

                if (this.Agenda_mat_preso == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_MAT_PRESO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_MAT_PRESO", this._agenda_mat_preso);

                if (this.Agenda_nome_preso == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_NOME_PRESO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_NOME_PRESO", this._agenda_nome_preso);

                if (this.Agenda_solicitado_por == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_SOLICITADO_POR", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_SOLICITADO_POR", this._agenda_solicitado_por);

                if (this.Agenda_interessado == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_INTERESSADO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_INTERESSADO", this._agenda_interessado);

                if (this.Agenda_beneficio == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_BENEFICIO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_BENEFICIO", this._agenda_beneficio);

                if (this.Agenda_pedido == new DateTime())
                    Cmd.Parameters.AddWithValue("@AGENDA_PEDIDO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_PEDIDO", this._agenda_pedido);

                if (this.Agenda_emitir_em == new DateTime())
                    Cmd.Parameters.AddWithValue("@AGENDA_EMITIR_EM", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_EMITIR_EM", this._agenda_emitir_em);

                if (this.Agenda_para == new DateTime())
                    Cmd.Parameters.AddWithValue("@AGENDA_PARA", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_PARA", this._agenda_para);            

                if (this.Agenda_status == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_STATUS", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_STATUS", this._agenda_status);            

                if (this.Agenda_exclusao == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_EXCLUSAO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_EXCLUSAO", this._agenda_exclusao);

                if (this.Agenda_execucao == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_EXECUCAO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_EXECUCAO", this._agenda_execucao);

                if (this.Agenda_processo == "")
                    Cmd.Parameters.AddWithValue("@AGENDA_PROCESSO", DBNull.Value);
                else Cmd.Parameters.AddWithValue("@AGENDA_PROCESSO", this._agenda_processo);  

                if (AbreConexao())
                {
                    //executa o comando SQL
                    retorno = ExecutaSQL();

                    //fecha a conexão
                    FechaConexao();
                }
                else
                    retorno = -1;
                return retorno;
            }

    Agora parte do form aonde faço o insert

    clsAgenda objGravar = new clsAgenda();

                            objGravar.Agenda_mat_preso = txtMatricula.Text.Trim().Replace("_", "").Replace("-", "").Replace(" ", "").Replace(".", "");
                            objGravar.Agenda_nome_preso = txtNome.Text.ToUpper();
                            objGravar.Agenda_solicitado_por = cbSolicitado.Text.Trim();
                            objGravar.Agenda_interessado = cbInteressado.Text.Trim();
                            objGravar.Agenda_beneficio = cbBeneficio.Text.Trim();
                            objGravar.Agenda_processo = cbProcesso.Text.Trim();
                            objGravar.Agenda_pedido = dataPedido;
                            //objGravar.Agenda_emitir_em = dataEmitir;
                            objGravar.Agenda_para = dataPara;
                            objGravar.Agenda_status = txtStatus.Text.Trim();
                            objGravar.Agenda_exclusao = "N";
                            objGravar.Agenda_execucao = txtExecucao.Text.Trim();

                            if (objGravar.Gravar() > 0)
                            {                            
                                MessageBox.Show("Registro gravado com sucesso para \r\n" + txtNome.Text.ToUpper() + " - " + txtMatricula.Text, "Sucesso");

    }

    Ou seja, no MessageBox.Show() quero por o ID que acaba de ser gerado. É possível?

    terça-feira, 6 de setembro de 2016 18:53

Respostas

  • Cara, você pode colocar o teu insert em uma procedure no banco para a inserção que retorna o seu identity mais ou menos assim:

    CREATE PROCEDURE [dbo].[INSERT_AGENDA]
    	@AGENDA_MAT_PRESO char(10), @AGENDA_NOME_PRESO char(10), @AGENDA_SOLICITADO_POR char(10), @AGENDA_INTERESSADO char(10), @AGENDA_BENEFICIO char(10),
        @AGENDA_PEDIDO char(10), @AGENDA_EMITIR_EM char(10), @AGENDA_PARA char(10), @AGENDA_STATUS char(10), @AGENDA_EXCLUSAO char(10), @AGENDA_EXECUCAO char(10), @AGENDA_PROCESSO char(10)
    AS
    BEGIN
        -- Insert statements for procedure here
    INSERT INTO AGENDA (AGENDA_ID, AGENDA_MAT_PRESO, AGENDA_NOME_PRESO, AGENDA_SOLICITADO_POR, AGENDA_INTERESSADO, AGENDA_BENEFICIO,
                                                        AGENDA_PEDIDO, AGENDA_EMITIR_EM, AGENDA_PARA, AGENDA_STATUS, AGENDA_EXCLUSAO, AGENDA_EXECUCAO, AGENDA_PROCESSO) 
                                                 VALUES (GEN_ID(GEN_AGENDA_ID,1), @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
                                                        @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO)
                     
    	SELECT @@Identity AS VALUE                 
    END
    

    Vai precisar ajustar para ficar certinho com os tipos e tamanhos da sua tabela.

    No seu código do C# você irá trocar o seu:

     Cmd.CommandText = @"INSERT INTO AGENDA (AGENDA_ID, AGENDA_MAT_PRESO, AGENDA_NOME_PRESO, AGENDA_SOLICITADO_POR, AGENDA_INTERESSADO, AGENDA_BENEFICIO,
                                                        AGENDA_PEDIDO, AGENDA_EMITIR_EM, AGENDA_PARA, AGENDA_STATUS, AGENDA_EXCLUSAO, AGENDA_EXECUCAO, AGENDA_PROCESSO) 
                                                 VALUES (GEN_ID(GEN_AGENDA_ID,1), @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
                                                        @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO) SELECT @@Identity";

    por:

     Cmd.CommandText = @"EXEC INSERT_AGENDA @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
    @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO";

    E onde está o seu retorno = ExecutaSQL(); você precisará utilizar o ExecuteScalar() da seguinte forma:

    retorno = Convert.ToInt32(Cmd.ExecuteScalar());

    Qualquer dúvida só dar um grito.

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Sugerido como Resposta Robson William Silva terça-feira, 6 de setembro de 2016 20:11
    • Marcado como Resposta Trassi terça-feira, 6 de setembro de 2016 20:57
    terça-feira, 6 de setembro de 2016 19:15

Todas as Respostas

  • Cara, você pode colocar o teu insert em uma procedure no banco para a inserção que retorna o seu identity mais ou menos assim:

    CREATE PROCEDURE [dbo].[INSERT_AGENDA]
    	@AGENDA_MAT_PRESO char(10), @AGENDA_NOME_PRESO char(10), @AGENDA_SOLICITADO_POR char(10), @AGENDA_INTERESSADO char(10), @AGENDA_BENEFICIO char(10),
        @AGENDA_PEDIDO char(10), @AGENDA_EMITIR_EM char(10), @AGENDA_PARA char(10), @AGENDA_STATUS char(10), @AGENDA_EXCLUSAO char(10), @AGENDA_EXECUCAO char(10), @AGENDA_PROCESSO char(10)
    AS
    BEGIN
        -- Insert statements for procedure here
    INSERT INTO AGENDA (AGENDA_ID, AGENDA_MAT_PRESO, AGENDA_NOME_PRESO, AGENDA_SOLICITADO_POR, AGENDA_INTERESSADO, AGENDA_BENEFICIO,
                                                        AGENDA_PEDIDO, AGENDA_EMITIR_EM, AGENDA_PARA, AGENDA_STATUS, AGENDA_EXCLUSAO, AGENDA_EXECUCAO, AGENDA_PROCESSO) 
                                                 VALUES (GEN_ID(GEN_AGENDA_ID,1), @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
                                                        @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO)
                     
    	SELECT @@Identity AS VALUE                 
    END
    

    Vai precisar ajustar para ficar certinho com os tipos e tamanhos da sua tabela.

    No seu código do C# você irá trocar o seu:

     Cmd.CommandText = @"INSERT INTO AGENDA (AGENDA_ID, AGENDA_MAT_PRESO, AGENDA_NOME_PRESO, AGENDA_SOLICITADO_POR, AGENDA_INTERESSADO, AGENDA_BENEFICIO,
                                                        AGENDA_PEDIDO, AGENDA_EMITIR_EM, AGENDA_PARA, AGENDA_STATUS, AGENDA_EXCLUSAO, AGENDA_EXECUCAO, AGENDA_PROCESSO) 
                                                 VALUES (GEN_ID(GEN_AGENDA_ID,1), @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
                                                        @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO) SELECT @@Identity";

    por:

     Cmd.CommandText = @"EXEC INSERT_AGENDA @AGENDA_MAT_PRESO, @AGENDA_NOME_PRESO, @AGENDA_SOLICITADO_POR, @AGENDA_INTERESSADO, @AGENDA_BENEFICIO,
    @AGENDA_PEDIDO, @AGENDA_EMITIR_EM, @AGENDA_PARA, @AGENDA_STATUS, @AGENDA_EXCLUSAO, @AGENDA_EXECUCAO, @AGENDA_PROCESSO";

    E onde está o seu retorno = ExecutaSQL(); você precisará utilizar o ExecuteScalar() da seguinte forma:

    retorno = Convert.ToInt32(Cmd.ExecuteScalar());

    Qualquer dúvida só dar um grito.

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Sugerido como Resposta Robson William Silva terça-feira, 6 de setembro de 2016 20:11
    • Marcado como Resposta Trassi terça-feira, 6 de setembro de 2016 20:57
    terça-feira, 6 de setembro de 2016 19:15
  • Segue exemplo de uma Stored Procedure recuperando o IDENTITY do registro gerado

    -- ============================================================
    -- Author     : Antonio Azevedo
    -- Create date: 22/08/2016
    -- Description: Incluir Alunos e retornar o ID no novo registro
    -- ============================================================
    Create PROCEDURE [dbo].[pcdAluno_Ins]
    @idcurso                INT,
    @nome                   VARCHAR(100),
    @email                  VARCHAR(100), 
    @dtcadastro             DATETIME = NULL, 
    @valor                  DECIMAL(15,2) = NULL
    AS
    BEGIN
         
        INSERT INTO alunos (idcurso, nome, email, dtcadastro, valor)
                           VALUES   (@idcurso, @nome, @email,  @dtcadastro, @valor)
         
        SELECT CONVERT(INT,@@IDENTITY) as retorno 
             
    END
    GO
    Para ficar claro você pode efetuar o select logo após o insert de seu registro

     SELECT CONVERT(INT,@@IDENTITY) as retorno 

    o detalhe é que tem que ser a mesma conexão que usou para fazer o insert, ela não pode ser fechada.

    se quiser ver mais exemplos de Stored Procedures veja a postagem a seguir

    http://www.codigoexpresso.com.br/Home/Postagem/72

    Se a resposta contribuiu com seu aprendizado por favor marque como Útil
    Se solucionou seu problema por favor marque como Resposta
    Atenção, se seu problema foi resolvido não deixe o post aberto 

    Visite : www.codigoexpresso.com.br


    quarta-feira, 7 de setembro de 2016 15:46