Zuerst muss ich alle Daten von ODBC erhalten (dies funktioniert bereits).
Dann kommt der komplizierteste Teil, bei dem ich mir noch nicht sicher bin, wie es gemacht werden kann. In ODBC gibt es zwei Datentabellen. Ich füge sie mit meinem aktuellen Code zusammen und filtere sie mit bestimmten Parametern.
Tabelle 1 in der Datenbank:
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
Tabelle 2 in der Datenbank:
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
Zusammengeführte Datentabelle sieht folgendermaßen aus:
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
Die zusammengeführte Ausgabedatentabelle sollte jedoch so aussehen (um die Möglichkeit zu haben, weiter damit zu arbeiten):
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
Suchen Sie nach Duplikaten in NAME
. Lassen Sie nur einen von ihnen, weisen Sie eine Nummer aus Tabelle 1 bis NRO
Tabelle 2 zu NRO1
. Die Nummern in Tabelle 1 sollten in sein NRO
, die Nummern in Tabelle 2 sollten in sein NRO1
.
Nach dem Herstellen einer Verbindung zu ODBC fülle ich eine Tabelle mit Daten aus Tabelle 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);
}
dann erhalte ich Daten aus einer anderen Tabelle 2 und füge sie zusammen durch:
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);
}
Danach führe ich eine Filterung durch (ich brauche Zeilen, die nur mit 4 und 1 Zoll beginnen NRO
, es gibt auch Zeilen mit einer anderen Startnummer):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Dann füge ich eine weitere Spalte hinzu für NRO1
(dies fügt auch Nullen hinzu (0) Ich brauche sie nicht in Spalte 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
}
Mit diesem Code kann ich Duplikate fangen
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
aber wie soll man den Rest erledigen? Dies sollte durch eine Schleife mit dem Erstellen einer neuen Tabelle durchgeführt werden? Wie kann ich Duplikate verbinden und entfernen dataTable
?
dataTable
für einen Namen mehr als zwei Duplikate enthalten? Ist es beispielsweise möglich, drei Duplikate für BMW zu existieren? 2. Wie können wir definieren, welche der doppelten Datensätze aufbewahrt und welche gelöscht werden sollen? Zum Beispiel können wir Aufzeichnungen mit einem Minimum führenNRO
und die anderen Aufzeichnungen löschen.NAME
. Wenn mehr als zwei - Fehler (Fehlerbehandlungsroutine). 2. In meinem Beispiel ist ein Fehler aufgetreten. Ich habe ihn jetzt behoben. Vielen Dank für die Erwähnung dieses, es ist wichtig.Antworten:
Sie können den
merge()
Aufruf durch eine benutzerdefinierte Methode ersetzen , die gleichzeitig das Zusammenführen und Filtern durchführt. Siehe das folgende Beispiel. Ich denke, dies ist ein besserer Ansatz als zuerst zusammenzuführen (doppelte Zeilen in die Ergebnistabelle einzufügen) und dann zu filtern (dh die doppelten Zeilen zu entfernen).Hierbei wird davon ausgegangen, dass alle Parameter das gleiche Format haben. Die
tTemp
Tabelle wird als temporärer Speicher für den Inhalt der Tabelle verwendet,t2
jedoch mit der zusätzlichen Spalte. Dadurch können die Zeilen in die Ergebnistabelle importiert werden.Vielleicht gibt es eine elegantere Lösung, aber diese sollte wie beabsichtigt funktionieren. Bitte beachten Sie, dass ich Ihre zusätzliche Anforderung bezüglich der zulässigen Werte für weggelassen habe
NRO
, die Sie sicher leicht hinzufügen können.quelle
'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?)
nach dem ErsetzendataTable.Merge(newTable);
durchdataTable.Merge_it(newTable);
class Merger {...}
meinen Code ein und rufe anMerger.merge_it(...)
. Sie müssen jedoch die Eingabeparameter vorbereiten.using
natürlich die fehlenden Anweisungen hinzufügen . Es ist nur ein Ausschnitt (aus einem Arbeitsprogramm).Versuche dies:
Setzen Sie den Standardwert 0 von NRO1 für Tabelle1 (ändern Sie queryStringSE).
Beispiel: SELECT NRO, 0 AS NRO1, NAME, NAMEA, NAMEB, ... FROM TABLE1
Setzen Sie den Standardwert 0 von NRO für Tabelle 2 (ändern Sie queryStringFI).
Beispiel: SELECT 0 AS NRO, NRO AS NRO1, NAME, NAMEA, NAMEB, ...... FROM TABLE2
Tabelle 1 sieht folgendermaßen aus:
Tabelle 2 sieht folgendermaßen aus:
Fügen Sie folgende Codezeilen hinzu:
quelle
Sie können denselben Spaltennamen in beiden Tabellen beibehalten, wenn sie denselben Entitätstyp bezeichnen. Dann wird dieser Code angezeigt
quelle