C# - Obtendo o ID do último registro inserido no banco de dados MySQL


Neste artigo vou mostrar como podemos obter o ID do último registro inserido no banco de dados MySQL.

Eu já mostrei como recuperar o ID do último registro inserido no MS Access e no SQL Server nestes artigos :

Vamos fazer a mesma coisa para o MySQL.

Então, como obter o ID do último registro inserido no banco de dados MySQL ?

A resposta é depende.

Sim, vai depender de como e quando você precisa obter essa informação.

Você deseja obter o último registro inserido ou o maior existente ? Pense bem...

Existem 4 abordagens que você pode usar :

1 -  Obter o valor do ID pelo maior valor da chave primária da tabela

SELECT MAX(ID) FROM tabela

Utiliza uma instrução SELECT usando a função MAX() que retorna o maior valor da coluna especificada, no caso a coluna ID. (*)

2 - Obter o ID usando uma consulta SELECT em ordem decrescente

SELECT ID FROM tabela ORDER BY ID DESC LIMIT 1

Utiliza uma instrução SELECT com a cláusula ORDER BY que ordena os registros pelo ID na ordem descendente (DESC) limitando o número de registros retornados a 1.(LIMI 1). (*)

(*) Obs: Nem sempre o maior será o último. Um usuário pode inserir manualmente um registro fora da ordem e neste caso não tem como saber qual o último usando as opções 1 e 2.

3- Obtendo o ID do último registro adicionado pelo comando INSERT INTO usando a função LAST_INSERT_ID

INSERT INTO tabela (nome) VALUES ('Macoratti'); SELECT LAST_INSERT_ID();

A função LAST_INSET_ID() retorna o último registro inserido, mas deve ser executada na mesma conexão que inseriu os registros. 

4- Obtendo o ID do último registro adicionado pelo comando INSERT INTO usando a propriedade LastInsertedId do objeto Command do Connector do MySQL

Esta opção é bem simples. Basta obter o valor da propriedade LastInsertedId do objeto Command usado na conexão. Veja um exemplo de código: 
if (cmd.LastInsertedId != 0)
   cmd.Parameters.Add(new MySqlParameter("ultimoId", cmd.LastInsertedId));

return Convert.ToInt32(cmd.Parameters["@ultimoId"].Value);

Geralmente, para obter o último registro inserido a opção 4 é a mais fácil de usar mas você tem que considerar as seguintes complicações :

  1. Transações simultâneas podem alterar o valor do último registro antes de você usar a função LAST_INSERT_ID() e ai você obtêm um valor que não corresponde ao real;
  2. A função somente vai funcionar se a instrução INSERT INTO executou sem erros;
  3. Se houver uma deleção de registros isso pode afetar o resultado;

Então o jeito é analisar o cenário de execução da consulta com cuidado levando em conta os fatores que podem atuar no momento da execução da sua consulta.

A seguir vou mostrar como usar a função em um cenário bem simples.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando a tabela de exemplo

Você vai precisar ter instalado o MySQL versão Community, o MySQL Connector/NET, o MySQL Workbench e no mínimo o VS 2013 ou VS 2015 versão Community ou Professional.

1 - Criando a tabela alunos

Vamos criar uma tabela chamada alunos em um banco de dados o MySQL usando o MySQL WorkBench.

A tabela terá a seguinte estrutura:

Observe que o campo ID é uma chave primária e Auto Increment, o que significa que o seu valor será incrementando automaticamente pelo SGBD após a inclusão de um registro.

Criando o projeto no Visual Studio 2015 Community

Abra o Visual Studio Community 2015 e clique em New Project;

Selecione Visual C# e o template Windows Forms Application.

Informe o nome Mysql_LastID e clique no botão OK.

Instalando o pacote do MySQL Connector via Nuget

No menu Tools clique em Nuget Packet Manager e a seguir em Manage Nuget Packages for Solution;

Clique na guia Browse, informe MySQL connector e a seguir escolha o pacote do MySql.Data marcando o projeto para o qual deseja instalar e clique em Install;

Definindo a interface com o usuário no formulário Form1.cs

No formulário Form1.cs inclua 4 Labels, 2 TextBox e dois Buttons e 1 DataGridView conforme o leiaute abaixo:

Implementando o código para obter o ID do último registro inserido

Neste exemplo eu estou usando um código bem simples no formulário apenas para mostrar o uso do recurso. Não estou fazendo validações nem tratando erros.

No formulário Form1.cs defina a string de conexão e um objeto MySqlConnection :

string _conexaoMySQL = "server=localhost;user id=root;password=******;database=cadastro";
MySqlConnection con = null;

Para exibir os registros no DataGridView estou usando o método :

        public DataTable SelecionaAlunos()
        {
            try
            {
                String sql = "SELECT * FROM alunos";
                con = new MySqlConnection(_conexaoMySQL);
                MySqlCommand cmd = new MySqlCommand(sql, con);
                MySqlDataAdapter da = new MySqlDataAdapter();
                da.SelectCommand = cmd;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
     }

Estou carregando os dados no evento Load:

     private void Form1_Load(object sender, EventArgs e)
     {
            dgvDados.DataSource = SelecionaAlunos();
     }

Estou inserindo registros na tabela aluno usando o evento Click do botão Inserir :

       private void btnInserir_Click(object sender, EventArgs e)
        {
            try
            {
                int ultimoID = InserirAluno(txtNome.Text, txtEmail.Text);
                lblResultado.Text = ultimoID.ToString();
                dgvDados.DataSource = SelecionaAlunos();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro :" + ex.Message);
            }
        }

 

No método InserirAluno() estou incluindo os dados e retornando um int que é o valor do último ID inserido na tabela:

        public int InserirAluno(string _nome, string _email)
        {
            try
            {
                String sql = "INSERT INTO alunos (nome,email) VALUES (@nome,@email)";
                con = new MySqlConnection(_conexaoMySQL);
                MySqlCommand cmd = new MySqlCommand(sql, con);
                cmd.Parameters.AddWithValue("@nome", _nome);
                cmd.Parameters.AddWithValue("@email", _email);
                con.Open();
                cmd.ExecuteNonQuery();
                // Verifica se existe um ultimo id inserido e adiciona um
                // parametro para tratá-lo
                if (cmd.LastInsertedId != 0)
                    cmd.Parameters.Add(new MySqlParameter("ultimoId", cmd.LastInsertedId));
                // Retorna o id do novo rgistro e convert de Int64 para Int32 (int).
                return Convert.ToInt32(cmd.Parameters["@ultimoId"].Value);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }

Executando o projeto e inserindo um registro, vemos o resultado abaixo exibindo o último ID do registro incluído:

Pegue o projeto completo aqui :  MySQL_LastID.zip

(Disse Jesus)Este povo se aproxima de mim com a sua boca e me honra com os seus lábios, mas o seu coração está longe de mim.
Mas, em vão me adoram, ensinando doutrinas que são preceitos dos homens.

Mateus 15:8,9

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti