Usuário com melhor resposta
Como alimentar um GridView com o resultado de duas DataTables ?

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.
Respostas
-
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".
- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 27 de outubro de 2016 14:14
- Marcado como Resposta Milena Lucena quinta-feira, 27 de outubro de 2016 15:07
-
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- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 27 de outubro de 2016 14:14
- Marcado como Resposta Milena Lucena quinta-feira, 27 de outubro de 2016 15:49
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 -
-
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".
- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 27 de outubro de 2016 14:14
- Marcado como Resposta Milena Lucena quinta-feira, 27 de outubro de 2016 15:07
-
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- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 27 de outubro de 2016 14:14
- Marcado como Resposta Milena Lucena quinta-feira, 27 de outubro de 2016 15:49
-
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();