Array
(
)

Obter o id do registro incluído para uso na tabela relacionada no MySQL

Starlima
|
MVP
    08 out 2012

Como faço para criar uma obter o retorno do id de um registro incluso em uma tabela, para usar posteriormente em outra tabela com relacionamento, no MySQL.
Exemplo tenho uma tabela de vendas e uma de itensdavenda, na intensdavenda preciso inserir o id da venda, mas não sei como recupera-lo apos a inserção no banco, alguma dica, de como recuperar este valor, sou novo em .net, e preciso de ajuda.

Tiago
|
MVP
Pontos: 120
    08 out 2012

Boa noite, existe varias formas de se recuperar uma é por exemplo:
#Código

int id=0;
Foreach(DataRow item in DataTable.Rows){

    id=int.parse(item["id_venda"]);


}



dessa forma você guarda o valor da chave em uma váriavel.
Espero ter ajudado

Alisson
|
MVP
Pontos: 3400
    09 out 2012

Conseguiu sanar sua duvida

Joel Rodrigues
   - 09 out 2012

como foi dito, existe várias formas. Você poderia, por exemplo, criar um stored procedure que inserisse o registro e retornasse o seu código.
Como você esta fazendo a inserção?

Starlima
|
MVP
    09 out 2012

Thiago agradeço,mas acho que desta forma não dará certo, uma vez que o registro na tabela do banco de dados só e feito no momento em que e adicionado, sendo assim não tenho como armazena-lo, acho que atravez de uma Stored Procedure seria o ideal, porem não sei bem como obter este retorno, e nem como armazena-lo em uma variavel, alguém tem um exemplo para que eu pesquise.

Agradeço.

Starlima
|
MVP
    09 out 2012

A inserção esta sendo feita atravez de uma consulta SQL, que acrescenta a venda na tabela, porem não consigo inserir os itens da venda pois não tenho o id da venda armazenado ou retornado pela consulta.

Alexsandro Trindade
   - 10 out 2012

Amigo, se vc tiver usando ADO.NET poderá criar uma classe para recuperar esse ID de acordo com a a tabela que tiver fazendo a insersção.

Exemplo:

public Int64 SelecionarUltimoRegistroGravado()
{
try
{
const string sql = "SELECT LAST_INSERT_ID(campo_id_da_tabela) " +
"AS ID from nome_tabela " +
"order by campo_id_da_tabela desc limit 1";

Int64 ultimoregistro = 0;

var leitor = ConexaoBanco.Select(sql);

if (leitor.HasRows)
{
while (leitor.Read())
{
ultimoregistro = Convert.ToInt64(leitor["ID"]);
}
}
return ultimoregistro;
}
catch (Exception e)
{
throw new ArgumentException("Erro ao executar a solicitação - " + e.Message);
}
}

Espero ter ajudado!

Abraços.

Alexsandro Trindade
   - 10 out 2012


Citação:
Amigo, se vc tiver usando ADO.NET poderá criar uma classe/método para recuperar esse ID de acordo com a a tabela que tiver fazendo a inserção.

Exemplo:

public Int64 SelecionarUltimoRegistroGravado()
{
try
{
const string sql = "SELECT LAST_INSERT_ID(campo_id_da_tabela) " +
"AS ID from nome_tabela " +
"order by campo_id_da_tabela desc limit 1";

Int64 ultimoregistro = 0;

var leitor = ConexaoBanco.Select(sql); //Select é um método da classe ConexaoBanco.

if (leitor.HasRows)
{
while (leitor.Read())
{
ultimoregistro = Convert.ToInt64(leitor["ID"]);
}
}
return ultimoregistro;
}
catch (Exception e)
{
throw new ArgumentException("Erro ao executar a solicitação - " + e.Message);
}
}

Espero ter ajudado!

Abraços.


Só lembrando que existe uma outra Classe chamada ConexaoBanco que faz o gerenciamento das conexões com o banco de dados.

Tiago
|
MVP
Pontos: 120
    10 out 2012

Como ja foi comentando, é interessante você percorrer o dataset ou o datatable.. E localizar a coluna com o id... Uma dica é utilizar alias, assim fica fácil de recuperar o valor. Por exemplo

Select nome_aluno as ALUNO

foreach(datarow linha in seudatatable.Rows){
STRING A =linha["ALUNO"].ToString();

}

Espero ter ajudado

Starlima
|
MVP
    10 out 2012


Citação:
como foi dito, existe várias formas. Você poderia, por exemplo, criar um stored procedure que inserisse o registro e retornasse o seu código.
Como você esta fazendo a inserção?


Citação:

Estou utilizando o entity framework, no qual criei uma classe, onde passo os valores para inserção direta na tabela, porem não tenho o retorno do id pois não sei como usar ou obter o retorno atravez de uma stored procedure.

Starlima
|
MVP
    10 out 2012

Agradeço as dicas, tanto do Thiago como do Alex que e possivel obter o ultimo registro no banco referente a tabela, fazendo as consultas como explicado...

Porem estava esperando uma dica atravez do retorno de uma stored Procedure no MySQL, obtendo o valor do retorno, uma vez que da maneira que fiz os dados são registrados primeiro na tabela vendas, sendo assim quero obter o id(autoincremento) da tabela para de vendas para ai inserir os registros na tabela itensdavenda, normalmente mais de um item por venda.

Obrigado por enquanto..

Geomar Canjundo
   - 11 out 2012

Gilberto,
do que entendi do seu problema penso que você pode fazer o seguinte:
Cria um metodo, que retorno um inteiro que pega o maior valor cadastrado na tabela venda após a última inclusão:
#Código

private int (string campo, string tabela)
{          string sql = "SELECT MAX(" + campo + ") AS INDICE FROM " + tabela;
            SqlCommand cmd = new SqlCommand(sql, conexao);
            cmd.CommandType = CommandType.Text;

            conexao.Open();
            SqlDataReader dr = cmd.ExecuteReader();


            int indice = 0;
            if (dr.Read())
            {
                indice = int.Parse(dr["INDICE"].ToString());

            }

            conexao.Close();
            return indice;
}




Esse metodo seria chamado logo após a inclusão e seria retorno do metod Insert da tabela Venda.
#Código

public int InserirVenda(VendaDTO dto)
      {
         string sql="sp_VENDA";
         int codigo = 0;
         SqlConnection conexao = this.ObterConexao();
         SqlCommand cmd = new SqlCommand(sql, conexao);
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.AddWithValue("@DESCRICAO", dto.PerDescricao);
         try 
         {
            conexao.Open();
            cmd.ExecuteNonQuery();
            codigo = ObterCodigoActual("PER_CODIGO", "ACA_PERIODO");
         }catch(Exception ex)
         {
             codigo=-1;
         
         }finally
         {
             conexao.Close();
             
         }

         return codigo;


      }


Espero ter ajudado.

Geomar Canjundo

Valter Furtado
   - 15 out 2012

Se você for ter conexões concorrentes esse negocio de executar a SP, voltar pra classe, executar um select, você corre o risco de ter um registro sendo inserido junto com o seu, assim vai ter problemas na hora de pegar o ID.

Na SP que você insere o registro faça no fim isso que foi citado acima,
SELECT LAST_INSERT_ID(campo_id_da_tabela) AS ID from nome_tabela order by campo_id_da_tabela desc limit 1;

Colocando em uma variável ou colocando somente isso no fim, e no método dentro da classe use um ExecuteScalar() assim você tem o seu ID do ultimo registro cadastrado.

Não tenho como testar isso aqui mas acredito que funcione.