none
Carregar um DataGrid com dadosdo banco através INNERJOIN RRS feed

  • Pergunta

  • Bom dia pessoal...

    Tenho uma procedure que dá um INNERJOIN nas tabelas País e UF.  Preciso carregar um grid de UFs, mas se ela contiver, além dos campos UF, apenas o IDPais sem o campo NomePais ficaria estranho. Por isso gostaria de carregar um grid via procedure com um InnerJoin juntando UF + País.

    Tenho um método no C# que me retornara um conjunto de UFS para carregar o DataGrid, mas não sei como vou encaixar o IDPais e NomePais (Vindos da procedure) já que pertencem a outra tabela mas estão juntos com UF através do InnerJoin... 

    Alguém saberia me ajudar?

    =Procedure ============================

    SELECT 
    UF.IDUF,
    UF.Nome AS NomeUF,
    UF.Sigla,
    UF.IDPais,
    PAIS.Nome AS NomePais,
    UF.Sistema
    FROM
    tblUf AS UF
    INNER JOIN 
    tblPais AS PAIS ON UF.IDPais = PAIS.IDPais
    WHERE UF.Nome LIKE '%'+ @Nome +'%'

    ==Método C#============================

                              public IEnumerable<UFDTO> ConsultarPorNome(String pNome)
            {
                try
                {
                    var Retorno = new List<UFDTO>();
                    CleanParameters();
                    AddParameter("@Nome", pNome);
                    var dataTable = RunConsultation(CommandType.StoredProcedure, "uspUFConsultarPorNome");

                    foreach (DataRow Linha in dataTable.Rows)
                    {
                        var UFDTO = new UFDTO
                        {
                            IDUf = Convert.ToInt32(Linha["IDUF"]),
                            Nome = Linha["Nome"].ToString(),
                            Sigla = Linha["Sigla"].ToString(),
                            Pais = (Linha["IDPais"] as PaisDTO), //Aqui carrega o IDPAis
                            //Aqui tenho que carregar o NomePais
                            Sistema = Convert.ToBoolean(Linha["Sistema"])
                        };

                        Retorno.Add(UFDTO);
                    }
                    return Retorno;
                }
                catch (Exception exception)
                {
                    throw new Exception("Não foi possivel efetuar busca: " + exception.ToString());
                }
            }

    quarta-feira, 22 de julho de 2015 13:05

Respostas

  • Pessoal, consegui... Alterei o Foreach do método para:

                   foreach (DataRow Linha in dataTable.Rows)
                    {
                        var PaisDTO = new PaisDTO
                        {
                            IDPais = Convert.ToInt32(Linha["IDPais"]),
                            Nome = Linha["NomePais"].ToString()
                        };
                        var UFDTO = new UFDTO
                        {
                            IDUf = Convert.ToInt32(Linha["IDUF"]),
                            Nome = Linha["NomeUF"].ToString(),
                            Sigla = Linha["Sigla"].ToString(),
                            Pais = PaisDTO,
                            Sistema = Convert.ToBoolean(Linha["Sistema"])

                        };

                        Retorno.Add(UFDTO);
                    }

    Agora ele carrega as UFS e para cada UF ele carrega um objeto País relacionado....

    Obrigaduuuu :)

    • Marcado como Resposta Jalber Romano quarta-feira, 22 de julho de 2015 14:44
    quarta-feira, 22 de julho de 2015 14:44

Todas as Respostas

  • Fala jalber,

    vc quer carregar no datagrid somente x tipos de informação ? é isso?

    bem se foi isso que eu entendi, o teu datagrid poderia ser iniciado assim

    datagridview1.AutoGenerateColumns = false; // não gera coluna automatico.

    ai vc cria as colunas de acodo com a sua necessidade em edit columns  lembrando que o campo DatapropertyName deve ter o mesmo nome do campo da sua procedure.

    então como exemplo :

    UF.Sigla

    no grid o HeaderText pode estar SIGLA

    o DatapropertyName  Sigla.

    Caso não seja isso fala ai.

    Att, Wsti.

    quarta-feira, 22 de julho de 2015 13:20
  • Obrigado por responder Wsti. Na vdd, já tenho um datagrid customizado... Meu único problema é com o método  public IEnumerable<UFDTO> ConsultarPorNome(String pNome). É que no C# já um relacionamento lógico entre País e UF. A função acima, quando for carregar uma UF, pedirá para passar um país... Como a procedure me retorna tb um nome de país, não sei como passá-lo ai nesta função...
    quarta-feira, 22 de julho de 2015 13:26
  • Pessoal, consegui... Alterei o Foreach do método para:

                   foreach (DataRow Linha in dataTable.Rows)
                    {
                        var PaisDTO = new PaisDTO
                        {
                            IDPais = Convert.ToInt32(Linha["IDPais"]),
                            Nome = Linha["NomePais"].ToString()
                        };
                        var UFDTO = new UFDTO
                        {
                            IDUf = Convert.ToInt32(Linha["IDUF"]),
                            Nome = Linha["NomeUF"].ToString(),
                            Sigla = Linha["Sigla"].ToString(),
                            Pais = PaisDTO,
                            Sistema = Convert.ToBoolean(Linha["Sistema"])

                        };

                        Retorno.Add(UFDTO);
                    }

    Agora ele carrega as UFS e para cada UF ele carrega um objeto País relacionado....

    Obrigaduuuu :)

    • Marcado como Resposta Jalber Romano quarta-feira, 22 de julho de 2015 14:44
    quarta-feira, 22 de julho de 2015 14:44