none
Como alimentar um GridView com o resultado de duas DataTables ? RRS feed

  • Pergunta

  • Bom dia. Estou tentando desenvolver em C# acessando um banco Progress e minha primeira dificuldade é que as tabelas do ERP da TOTVS estão separadas em vários bancos. Até onde vai meu conhecimento, consigo alimentar um DataTable por conexão a um único banco. O que gostaria de fazer é um join de, pelo menos, duas tabelas que estão em bancos diferentes para poder alimentar o GridView.

    Exemplo da chamada principal para alimentar o GridView:

    OdbcConnection conn = new OdbcConnection(ConfigurationManager.AppSettings["conexaoSrmovben"]); //Conexão com o banco Srmovben, onde encontram-se as tabelas "usuario" e "propost"
    DataTable dtSrmovben = new DataTable();
    conn.Open();
    string sql = "select usuario.\"cd-modalidade\",usuario.\"nr-proposta\",usuario.\"nr-ter-adesao\",usuario.\"cd-usuario\",usuario.\"nm-usuario\",propost.\"idi-plano-ans\" from pub.\"usuario\", pub.\"propost\" where usuario.\"cd-modalidade\"=propost.\"cd-modalidade\" and usuario.\"nr-proposta\" = propost.\"nr-proposta\" and usuario.\"cd-controle-oper-ans\"=" + cdControleOper ;
    OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
    da.Fill(dt);
    return dtSrmovben;

    Para complementar o Grid, preciso dos campos "cdn-plano-ans" e "cod-plano-operadora" que encontram-se na tabela reg-plano-saude do banco Srcadger. O sql que preciso fazer é:

    string sql = "select "cdn-plano-ans", "cod-plano-operadora" from  pub."reg-plano-saude" where "reg-plano-saude".idi-registro = " + cdRegistroPlano ; //cdRegistroPlano é a informação do campo propost.idi-plano-ans do resultado de outra conexão. 

    Quem puder me ajudar, desde já agradeço.


    quinta-feira, 27 de outubro de 2016 11:39

Respostas

Todas as Respostas

  • Olá Milena,

    Uma pergunta, esses duas databases estão no mesmo servidor de banco de dados?

    Caso estejam, você pode ter acesso a diferentes bases, colocando o nome da tabela na seguinte estrutura na sua consulta, exemplo:

    Srmovben.dbo.usuario

    Srcadger.dbo.reg-plano-saude

    Deste modo você consegue fazer JOINS entre elas, mas claro, isso se uma database "enxergar" a outra, estando no mesmo servidor.


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 27 de outubro de 2016 11:50
  • Oi André.

    Estão no mesmo servidor, porém, na string de conexão, são utilizadas portas diferentes...

    quinta-feira, 27 de outubro de 2016 11:55
  • Milena,

    O banco de dados é SQL Server? Caso sim, e considerando que estão usando portas diferentes, então suponho que tenha múltiplas instâncias do DBMS no mesmo servidor, deste modo poderia acessar uma das instâncias e configurar a outra como Linked Server.

    Mas caso a resposta seja não, você pode preencher dois DataTables com conexões diferentes e depois usar LINQ para fazer o join.

    Veja um exemplo no StackOverflow: http://stackoverflow.com/questions/665754/inner-join-of-datatables-in-c-sharp


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 27 de outubro de 2016 12:18
  • Sim, como o Juliano comentou, pode usar Linked Server para conseguir fazer a consulta entre as bases.

    Olha só como vc pode criar o linked server: https://msdn.microsoft.com/en-US/library/ff772782.aspx


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 27 de outubro de 2016 12:50
  • Obrigada a André e Juliano. Consegui o que eu queria com o seguinte código:
    DataTable dtJoin = new DataTable();
    dtJoin.Columns.Add("nrTermo"   , typeof(int));
    dtJoin.Columns.Add("cdUsuario" , typeof(int));
    dtJoin.Columns.Add("cdRegPlano", typeof(int));
    dtJoin.Columns.Add("RegPlano"  , typeof(int));

    var results = from table1 in dtUsuario.AsEnumerable()
                  join table2 in dtRegPlanos.AsEnumerable() on (int)table1["idi-plano-ans"] equals (int)table2["idi-registro"]
                  select new
                  {   nrTermo    = (int)table1["nr-ter-adesao"],
                      cdUsuario  = (int)table1["cd-usuario"],
                      cdRegPlano = (int)table1["idi-plano-ans"],
                      RegPlano   = (int)table2["cdn-plano-ans"]
                  };
    foreach (var item in results)
    {
        DataRow row = dtJoin.NewRow();
        row["nrTermo"]     = item.nrTermo;
        row["cdUsuario"]   = item.cdUsuario;
        row["cdRegPlano"] = item.cdRegPlano;
        row["RegPlano"]    = item.RegPlano;
        dtJoin.Rows.Add(row);
    }

    GridView5.DataSource = dtJoin;
    GridView5.DataBind();


    quinta-feira, 27 de outubro de 2016 15:23