locked
recuperar id de um metodo RRS feed

  • Pergunta

  • Bom dia,

    Tenho um evento salvar, esse evento salva em duas tabelas.

    Mas preciso recuperar o id do primeiro método para salvar no segundo método.

    no primeiro método, a query está me retornando o id a Salvar = (RETURNING ID).

    Mas não esta salvando somente o id.

    código do evento:

       else
                {
                    DTO.Agenda agen = new DTO.Agenda();
                    agen.agen_nro_processo = txtProcesso.Text;
                    agen.descricao_agenda = txtDetalhamento.Text;
                    agen.agen_us_id = lstUsuarios.SelectedValue.ToInt();
                    agen.agen_prazo = Convert.ToDateTime(calendarioPrazo.SelectedDate);
                    agen.agen_status_id = lstStatus.SelectedValue.ToInt();
    
                    agen.agen_id = new BLL.CadastroAgenda().inserirAgenda(agen);
    
                    for (txtDetalhamento.Text )
                    {
                        new BLL.CadastroAgenda().inserirDescricao(agen);
                        
                    }
                    
                }

    método:

      public int inserirAgenda(DTO.Agenda agen)
            {
                StringBuilder strQuery = new StringBuilder();
                strQuery.Append("INSERT INTO tb_agenda_advogados( ");
                strQuery.Append("agen_nro_processo, agen_us_id,  ");
                strQuery.Append(" agen_prazo, status_agen_id )");
                strQuery.Append("values(@agen_nro_processo, @agen_us_id, ");
                strQuery.Append(" @agen_prazo, @status_agen_id) RETURNING agen_id; ");
    
                using (NpgsqlConnection con = new NpgsqlConnection(strConSalamone))
                {
                    try
                    {
                        con.Open();
                        using (NpgsqlCommand cmd = new NpgsqlCommand(strQuery.ToString(), con))
                        {
                            cmd.Parameters.AddWithValue("@agen_nro_processo", agen.agen_nro_processo);
                            cmd.Parameters.AddWithValue("@agen_us_id", agen.agen_us_id);
                            //cmd.Parameters.AddWithValue("@agen_descricao", agen.agen_descricao);
                            //cmd.Parameters.AddWithValue("@descricao_agenda", agen.descricao_agenda);
                            cmd.Parameters.AddWithValue("@agen_prazo", agen.agen_prazo);
                            cmd.Parameters.AddWithValue("@status_agen_id", agen.agen_status_id);
    
                            using (NpgsqlDataReader rd = cmd.ExecuteReader())
                            {
                                if (rd.Read())
                                    return rd[0].ToString().ToInt();
                                else
                                    return 0;
                            }                                             
                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                    finally
                    {
                        con.Close();
                    }
                }
            }


    Fernando Gomes

    terça-feira, 12 de janeiro de 2016 11:57

Respostas

  • Voce pode utilizar o seguinte comando ao final da sua query

    ;SELECT CAST(scope_identity() AS int);

    ele irá retornar o ultimo ID.


    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
    • Editado Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:06
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:06
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:05
  • Fernando, pelo que entendi a sua query e método estão te retornando o ID com sucesso, porém não está sendo possível salvar o registro com o mesmo ID no segundo método. É isso?

    Se for imagino que o problema esteja na modelagem da tabela do segundo método. Na tabela de descrição da agenda você possui um ID de descrição e um ID de agenda?

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:10
  • Erick, desculpe! deixa eu ver se eu entendi!

    eu tiro essa parte do meu metodo?        

     using (NpgsqlDataReader rd = cmd.ExecuteReader())
                            {
                                if (rd.Read())
                                    return rd[0].ToString().ToInt();
                                else
                                    return 0;
                            }                       

    e insiro a linha que me passou?


    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:10
  • sim possui e interligado pela chave estrangeira.

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:19
  • Isto mesmo, ou voce pode usar o cmd.ExecuteScalar que retornará um objeto, converta ele para int e estará com este ID

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

     
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:33
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:33
  • Erick, o metodo está retornando o id, mas não estou conseguindo pegar ele no evento apenas.

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 12:46
  • Convert.ToInt32(rd[0]);
    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:50
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 12:50
  • como ficaria o método inteiro?

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 12:54
  •       //em sua query adicione ele no fim
          strQuery.Append(" @agen_prazo, @status_agen_id) RETURNING agen_id;SELECT CAST(scope_identity() AS int); ");
          
          //REMOVA TODA o codigo do using (NpgsqlDataReader rd = cmd.ExecuteReader()) ...
          //e retorne direto o inteiro
           return Convert.ToInt32(cmd.ExecuteExecuteScalar());
    
           //----------------------------------------------------------
          //ou mantenha seu metodo apenas convertendo o retorno
           using (NpgsqlDataReader rd = cmd.ExecuteReader())
                            {
                                if (rd.Read())
                                    return Convert.ToInt32(rd[0]);
                                else
                                    return 0;
                            }   
    
           

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 13:15
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:15
  • Fernando tenta depurar o método pra identificar o problema...se está retornando ID é alguma falha pequena no código.
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:16
  • e como chamar ele no evento?

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:29
  • assim?:

     else
                {
                    DTO.Agenda agen = new DTO.Agenda();
                    agen.agen_nro_processo = txtProcesso.Text;
                    agen.descricao_agenda = txtDetalhamento.Text;
                    agen.agen_us_id = lstUsuarios.SelectedValue.ToInt();
                    agen.agen_prazo = Convert.ToDateTime(calendarioPrazo.SelectedDate);
                    agen.agen_status_id = lstStatus.SelectedValue.ToInt();
    
                     new BLL.CadastroAgenda().inserirAgenda(agen);
                     agen.agen_id = new BLL.CadastroAgenda().inserirDescricao(agen);             
                }



    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:31
  • Para perguntas diferentes, crie uma nova thread para manter a organização do forúm, se a resposta acima lhe ajudou ou resolveu seu problema, peço que marque como resposta
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:37

Todas as Respostas

  • Voce pode utilizar o seguinte comando ao final da sua query

    ;SELECT CAST(scope_identity() AS int);

    ele irá retornar o ultimo ID.


    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
    • Editado Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:06
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:06
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:05
  • Fernando, pelo que entendi a sua query e método estão te retornando o ID com sucesso, porém não está sendo possível salvar o registro com o mesmo ID no segundo método. É isso?

    Se for imagino que o problema esteja na modelagem da tabela do segundo método. Na tabela de descrição da agenda você possui um ID de descrição e um ID de agenda?

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:10
  • Erick, desculpe! deixa eu ver se eu entendi!

    eu tiro essa parte do meu metodo?        

     using (NpgsqlDataReader rd = cmd.ExecuteReader())
                            {
                                if (rd.Read())
                                    return rd[0].ToString().ToInt();
                                else
                                    return 0;
                            }                       

    e insiro a linha que me passou?


    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:10
  • sim possui e interligado pela chave estrangeira.

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:19
  • Isto mesmo, ou voce pode usar o cmd.ExecuteScalar que retornará um objeto, converta ele para int e estará com este ID

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

     
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:33
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:42
    terça-feira, 12 de janeiro de 2016 12:33
  • Erick, o metodo está retornando o id, mas não estou conseguindo pegar ele no evento apenas.

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 12:46
  • Convert.ToInt32(rd[0]);
    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 12:50
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 12:50
  • como ficaria o método inteiro?

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 12:54
  •       //em sua query adicione ele no fim
          strQuery.Append(" @agen_prazo, @status_agen_id) RETURNING agen_id;SELECT CAST(scope_identity() AS int); ");
          
          //REMOVA TODA o codigo do using (NpgsqlDataReader rd = cmd.ExecuteReader()) ...
          //e retorne direto o inteiro
           return Convert.ToInt32(cmd.ExecuteExecuteScalar());
    
           //----------------------------------------------------------
          //ou mantenha seu metodo apenas convertendo o retorno
           using (NpgsqlDataReader rd = cmd.ExecuteReader())
                            {
                                if (rd.Read())
                                    return Convert.ToInt32(rd[0]);
                                else
                                    return 0;
                            }   
    
           

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
    • Sugerido como Resposta Erick WendelMVP terça-feira, 12 de janeiro de 2016 13:15
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:15
  • Fernando tenta depurar o método pra identificar o problema...se está retornando ID é alguma falha pequena no código.
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:16
  • e como chamar ele no evento?

    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:29
  • assim?:

     else
                {
                    DTO.Agenda agen = new DTO.Agenda();
                    agen.agen_nro_processo = txtProcesso.Text;
                    agen.descricao_agenda = txtDetalhamento.Text;
                    agen.agen_us_id = lstUsuarios.SelectedValue.ToInt();
                    agen.agen_prazo = Convert.ToDateTime(calendarioPrazo.SelectedDate);
                    agen.agen_status_id = lstStatus.SelectedValue.ToInt();
    
                     new BLL.CadastroAgenda().inserirAgenda(agen);
                     agen.agen_id = new BLL.CadastroAgenda().inserirDescricao(agen);             
                }



    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:31
  • Para perguntas diferentes, crie uma nova thread para manter a organização do forúm, se a resposta acima lhe ajudou ou resolveu seu problema, peço que marque como resposta
    • Marcado como Resposta fgoliveira terça-feira, 12 de janeiro de 2016 13:41
    terça-feira, 12 de janeiro de 2016 13:37