none
Como pegar o último ID cadastrado na tabela RRS feed

  • Pergunta

  • Boa Tarde Pessoal,

    Como eu faço para pegar o último ID que foi cadastrado no banco de dados e se eu preciso alterar algo na minha tabela.

    Hoje eu tenho a seguinte função que cadastra:

     public bool incluir(Cliente p_objCliente)
           {
               bool blnRetorno = false;
    
               string strSQL = "INSERT INTO Cliente (ID, Nome, DataCadastro, CNPJ) VALUES (@PID, @pNome, @pDataCadastro, @pCNPJ)";
    
               List<SqlParameter> objParam = new List<SqlParameter>();
               objParam.Add(new SqlParameter("@pID", p_objCliente.ID));
               objParam.Add(new SqlParameter("@pNome", p_objCliente.Nome));
               objParam.Add(new SqlParameter("@pDataCadastro", p_objCliente.DataCadastro));
               objParam.Add(new SqlParameter("@pCNPJ", p_objCliente.CNPJ));
    
               blnRetorno = objConnManager.executarComando(strSQL, objParam);
    
               return blnRetorno;
           }

    Vlw Pessoal 

    []'s


    terça-feira, 6 de novembro de 2012 15:32

Respostas

  • Olá Alan. Com uma pequena alteração em sua instrução, voce consegue recuperar o ID do registro. Vale lembrar que deve haver uma coluna definida como PrimaryKey em sua tabela.

    Pelo seu código acima, dá para ver que voce usa objetos que voce criou para manipular o seu banco, por isso vou postar o codigo nativo do SqlClient e voce adapta para seu objeto.

    string connectionString = "sua string de conexao com o banco";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    	connection.Open();
    
    	string strSQL = "INSERT INTO Cliente (ID, Nome, DataCadastro, CNPJ) VALUES (@PID, @pNome, @pDataCadastro, @pCNPJ) ";
            strSQL += ";"
            strSQL += "SELECT SCOPE_IDENTITY()"
       
    	using (SqlCommand command = new SqlCommand(strSQL, connection))
    	{
    	   command.Parameters.Add(new SqlParameter("@pID", p_objCliente.ID));
    	   command.Parameters.Add(new SqlParameter("@pNome", p_objCliente.Nome));
    	   command.Parameters.Add(new SqlParameter("@pDataCadastro", p_objCliente.DataCadastro));
    	   command.Parameters.Add(new SqlParameter("@pCNPJ", p_objCliente.CNPJ));
    	   int ultimoID = command.ExecteScalar();
    	}
    }
    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    terça-feira, 6 de novembro de 2012 15:57

Todas as Respostas

  • Olá Alan. Com uma pequena alteração em sua instrução, voce consegue recuperar o ID do registro. Vale lembrar que deve haver uma coluna definida como PrimaryKey em sua tabela.

    Pelo seu código acima, dá para ver que voce usa objetos que voce criou para manipular o seu banco, por isso vou postar o codigo nativo do SqlClient e voce adapta para seu objeto.

    string connectionString = "sua string de conexao com o banco";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    	connection.Open();
    
    	string strSQL = "INSERT INTO Cliente (ID, Nome, DataCadastro, CNPJ) VALUES (@PID, @pNome, @pDataCadastro, @pCNPJ) ";
            strSQL += ";"
            strSQL += "SELECT SCOPE_IDENTITY()"
       
    	using (SqlCommand command = new SqlCommand(strSQL, connection))
    	{
    	   command.Parameters.Add(new SqlParameter("@pID", p_objCliente.ID));
    	   command.Parameters.Add(new SqlParameter("@pNome", p_objCliente.Nome));
    	   command.Parameters.Add(new SqlParameter("@pDataCadastro", p_objCliente.DataCadastro));
    	   command.Parameters.Add(new SqlParameter("@pCNPJ", p_objCliente.CNPJ));
    	   int ultimoID = command.ExecteScalar();
    	}
    }
    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    terça-feira, 6 de novembro de 2012 15:57
  • Vlw Washington pela ajuda.

    Se vc observar logo em abaixo eu chamo a função executarComando, que me retorna um booleano.

    Eu preciso alterar o tipo do meu retorno para int ?

    Vlw

    terça-feira, 6 de novembro de 2012 16:13
  • Ola Alan.

    Ai depende de sua implementação. Se o seu metodo executarComando já fizer o teste se o ID recuperado é maior que zero, então não precisa alterar o tipo. Como falei, o código que passei usa os objetos nativos do .NET.

    Voce pode fazer todos os tratamentos dentro do seu metodo executarComando. Neste caso, o seu codigo do post não sofreria nenhuma alteração, somente o codigo do metodo executarComando.

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    terça-feira, 6 de novembro de 2012 18:41
  • Amigo,

    Como o seu método retorna um booleano mudar ele pode implicar em outras partes da aplicação, então nesse caso você teria que criar uma nova chamada logo após o seu INSERT só que nesse caso pegando as informações do banco, ex:

    public int ultimoID()
           {
               int retorno = 0;
    
               string strSQL = "SELECT SCOPE_IDENTITY()";
    	   //na linha abaixo você precisa chamar o método/função que retorna as informações do banco
               blnRetorno = objConnManager._EXECUTAR_COMANDO_RETORNAR_VALOR(strSQL);
    
               return retorno;
           }

    Seria algo mais ou menos como o código acima.

    Espero ter ajudado e boa sorte!


    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"

    terça-feira, 6 de novembro de 2012 18:42
  • Vlw Pessoal

    Então minha função é executarComando é:

     public bool executarComando(string p_strSql, List<SqlParameter> p_obParams)
           {
               bool blnresult = false;
    
               if (!this.conectar()) {
                   return false; 
               }
    
               SqlCommand objCmd = new SqlCommand(p_strSql, objConn);
               foreach (SqlParameter param in p_obParams)
               {
                   objCmd.Parameters.Add(param);
               }
    
               try 
               {
                   blnresult = (objCmd.ExecuteNonQuery() > 0 ? true : false);
                
               }
               catch
               {
                    blnresult = false;
               }
    
               this.desconectar();
    
               return blnresult;
           }

    Vlw

    quarta-feira, 7 de novembro de 2012 11:47
  • Você vai precisar criar um novo método para retornar um INT com o último ID inserido, utilizando a técnica SCALAR que já foi citada, ou retornar um DataTable com as informações, aconselho essa última pois dessa forma você pode re-utilizar ela futuramente para outros fins.

    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"

    quarta-feira, 7 de novembro de 2012 12:39
  • Então quer dizer que vou ter que fazer dois métodos distintos ?

    Vlw

    quarta-feira, 7 de novembro de 2012 18:41
  • Isso mesmo...pois um você já tem que retorna um bool quando executa o método e o outro deve retornar um datatable, que eu aconselho, ou um int com o último id.

    Espero ter ajudado e não se esqueça de marcar as respostas que te ajudaram.

    Boa sorte!


    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"

    quinta-feira, 8 de novembro de 2012 10:44
  • Vou retornar a Thread para o fórum ASP.NET pois pelo que entendi a dúvida do Alan não é em relação a banco de dados: ao contrário, ele já sabe qual comando usar (SCOPE_IDENTITY) para resgatar o último ID cadastrado.

    No decorrer da discussão, o que foi colocado em pauta é se deveria ser criado ou não um novo método para retornar a informação desejada, mas dentro da programação.

    Alan, qualquer dúvida em relação ao SQL Server, por favor, nos acione.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 19 de novembro de 2012 13:10