Usuário com melhor resposta
Recuperar @@Identity no Form

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?
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
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
-
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- Editado Código Expresso quarta-feira, 7 de setembro de 2016 15:47