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
?
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.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.Odpowiedzi:
Możesz zastąpić
merge()
wywołanie niestandardową metodą, która jednocześnie scala i filtruje. Zobacz przykład poniżej. Myślę, że jest to lepsze podejście niż pierwsze scalenie (wprowadzenie zduplikowanych wierszy w tabeli wyników), a następnie filtrowanie (tj. Usunięcie zduplikowanych wierszy).Zakłada się tutaj, że wszystkie parametry mają ten sam format.
tTemp
Tabela służy jako tymczasowy przechowywania zawartości tabelit2
, ale z dodatkową kolumnę. Umożliwia to importowanie wierszy w tabeli wyników.Być może istnieje bardziej eleganckie rozwiązanie, ale powinno działać zgodnie z przeznaczeniem. Pamiętaj, że pominąłem twoje dodatkowe wymagania dotyczące dozwolonych wartości
NRO
, które z pewnością możesz łatwo dodać.źródło
'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?)
dataTable.Merge(newTable);
dataTable.Merge_it(newTable);
class Merger {...}
mój kod i zadzwońMerger.merge_it(...)
. Musisz jednak przygotować parametry wejściowe.using
oczywiście musisz dodać brakujące dyrektywy. To tylko fragment (z działającego programu).Spróbuj tego:
Ustaw wartość domyślną 0 NRO1 dla Table1 (zmodyfikuj queryStringSE)
np .: SELECT NRO, 0 AS NRO1, NAME, NAMEA, NAMEB, ... FROM TABLE1
Ustaw domyślną wartość 0 NRO dla Table2 (zmodyfikuj queryStringFI)
np .: WYBIERZ 0 JAKO NRO, NRO JAK NRO1, NAZWA, NAMEA, NAMEB, ...... Z TABELI 2
Tabela 1 będzie wyglądać następująco:
Tabela 2 będzie wyglądać następująco:
Dodaj następujące wiersze kodu:
źródło
możesz zachować tę samą nazwę kolumny w obu tabelach, jeśli oznaczają one ten sam typ encji, a następnie zobacz ten kod
źródło