Em primeiro lugar, preciso obter todos os dados do ODBC (isso já está funcionando).
Depois vem a parte mais complicada que ainda não tenho certeza de como isso pode ser feito. Existem duas tabelas de dados no ODBC. Estou mesclando-os com o meu código atual e filtrando-os com certos parâmetros.
Tabela 1 no banco de dados:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Tabela 2 no banco de dados:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
A tabela de dados mesclada fica assim:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
No entanto, o dataTable de saída mesclado deve ter esta aparência (para ter a possibilidade de trabalhar com ele ainda mais):
NRO NRO1 NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
123 423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 463 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Encontre duplicatas em NAME
. Deixe apenas um deles, atribua um número da Tabela 1 a NRO
da Tabela 2 a NRO1
. Quadro 1 os números devem ser em NRO
, Tabela 2 os números devem ser em NRO1
.
Após conectar-me ao ODBC, estou preenchendo uma tabela com dados da Tabela 1
DataTable dataTable = new DataTable("COMPANY");
using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);
dadapterSE.Fill(dataTable);
}
então estou obtendo dados de outra Tabela 2 e os mesclando por:
using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);
var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);
dataTable.Merge(newTable);
}
Depois disso, estou realizando a filtragem (preciso ter linhas iniciando apenas com 4 e 1 pol. NRO
, Também há linhas com outro número inicial):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Então estou adicionando mais uma coluna para NRO1
(isso também está adicionando zeros (0), não preciso deles na coluna NRO1
):
results.Columns.Add("NRO1", typeof(int)).SetOrdinal(1);
foreach (DataRow row in results.Rows)
{
//need to set value to NewColumn column
row["NRO1"] = 0; // or set it to some other value
}
Eu posso pegar duplicatas com este código
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
mas como fazer o resto? Isso deve ser realizado por um loop com a construção de uma nova tabela? Como posso realizar a junção e a remoção de duplicatas dataTable
?
dataTable
conter mais de duas duplicatas para algum nome? Por exemplo, é possível existir três duplicatas para a BMW? 2. Como podemos definir quais registros duplicados manter e quais excluir? Por exemplo, podemos manter o registro com o mínimoNRO
e excluir o outro registro.NAME
. Se mais de dois - erro (manipulador de erros). 2. Houve um erro no meu exemplo, eu o corrigi agora. Obrigado por mencionar este, é importante.Respostas:
Você pode substituir a
merge()
chamada por um método personalizado, que faz a mesclagem e a filtragem ao mesmo tempo. Veja o exemplo abaixo. Eu acho que essa é uma abordagem melhor do que a primeira mesclagem (introdução de linhas duplicadas na tabela de resultados) e a filtragem (ou seja, remoção das linhas duplicadas).Aqui, supõe-se que todos os parâmetros tenham o mesmo formato. A
tTemp
tabela é usada como armazenamento temporário para o conteúdo da tabela,t2
mas com a coluna extra. Isso permite importar as linhas na tabela de resultados.Talvez exista uma solução mais elegante, mas isso deve funcionar como pretendido. Observe que deixei de lado sua exigência adicional em relação aos valores permitidos
NRO
, os quais tenho certeza de que você pode adicionar facilmente.fonte
'DataTable' does not contain a definition for 'Merge_it' and no accessible extension method 'Merge_it' accepting a first argument of type 'DataTable' could be found (are you missing a using directive or an assembly reference?)
depois de substituirdataTable.Merge(newTable);
pordataTable.Merge_it(newTable);
class Merger {...}
meu código e ligarMerger.merge_it(...)
. Você precisa preparar os parâmetros de entrada.using
diretivas ausentes , é claro. É apenas um trecho (de um programa de trabalho).Tente o seguinte:
Defina o valor padrão 0 de NRO1 para Tabela1 (modifique queryStringSE)
por exemplo: SELECT NRO, 0 AS NRO1, NAME, NAMEA, NAMEB, ... FROM TABLE1
Defina o valor padrão 0 do NRO para a Tabela2 (modificar queryStringFI)
por exemplo: SELECT 0 AS NRO, NRO AS NRO1, NAME, NAMEA, NAMEB, ...... DA TABELA2
A Tabela1 será semelhante a:
A Tabela2 será semelhante a:
Adicione as seguintes linhas de código:
fonte
você pode manter o mesmo nome da coluna nas duas tabelas se elas denotarem o mesmo tipo de entidade e, em seguida, ver este código
fonte