Najpierw muszę uzyskać wszystkie dane z ODBC (to już działa).
Potem pojawia się najbardziej skomplikowana część, której nie jestem jeszcze pewien, jak to zrobić. Istnieją dwie tabele danych w ODBC. Łączę je z moim bieżącym kodem i filtruję według określonych parametrów.
Tabela 1 w bazie danych:
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 w bazie danych:
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
Scalona tabela danych wygląda następująco:
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
Jednak scalona tabela danych wyjściowych powinna wyglądać tak (aby mieć możliwość dalszej pracy z nią):
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
Znajdź duplikaty w NAME
. Pozostaw tylko jeden z nich, przypisz numer z Tabeli 1 do NRO
Tabeli 2 do NRO1
. Numery z tabeli 1 powinny być podane NRO
, numery z tabeli 2 powinny być podane NRO1
.
Po połączeniu z ODBC wypełniam jedną tabelę danymi z Tabeli 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);
}
następnie otrzymuję dane z innej tabeli 2 i łączę je przez:
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);
}
Następnie wykonuję filtrowanie (muszę mieć wiersze zaczynające się od 4 i 1 w NRO
, są też wiersze z innym numerem początkowym):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Następnie dodaję jeszcze jedną kolumnę dla NRO1
(to także dodaje zera (0) Nie potrzebuję ich w kolumnie 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
}
Za pomocą tego kodu mogę łapać duplikaty
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
ale jak wykonać resztę? Powinno to zostać wykonane przez pętlę z budowaniem nowego stołu? Jak mogę wykonać łączenie i usuwanie duplikatów dataTable
?
NAME
. Jeśli więcej niż dwa - błąd (moduł obsługi błędów). 2. W moim przykładzie wystąpił błąd, naprawiłem go teraz. Dziękuję, że wspomniałeś o tym, to ważne.
dataTable
zawierać więcej niż dwa duplikaty dla niektórych nazwisk? Na przykład, czy możliwe jest istnienie trzech duplikatów dla BMW? 2. Jak możemy zdefiniować, które z powielonych rekordów zachować, a które usunąć? Na przykład możemy zachować rekord z minimumNRO
i usunąć drugi rekord.