Back-End

16 fev, 2017

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

Publicidade

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 é:a 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:

  • 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. (*)

  • 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.

  • 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.

  • 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:

  • 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;
  • A função somente vai funcionar se a instrução INSERT INTO executou sem erros;
  • 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.

Criando a tabela alunos

Vamos criar uma tabela chamada alunos em um banco de dados 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. Depois, 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