Pertama saya harus mendapatkan semua data dari ODBC (ini sudah berfungsi).
Kemudian muncul bagian yang paling rumit yang saya belum yakin bagaimana hal itu bisa dilakukan. Ada dua tabel data di ODBC. Saya menggabungkannya dengan kode saya saat ini dan memfilternya dengan parameter tertentu.
Tabel 1 dalam database:
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
Tabel 2 dalam database:
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
DataTable gabungan terlihat seperti ini:
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
Namun data output gabungan digabung akan terlihat seperti ini (untuk memiliki kemungkinan untuk bekerja dengannya lebih lanjut):
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
Temukan duplikat di NAME
. Sisakan satu saja, tetapkan nomor dari Tabel 1 hingga NRO
dari Tabel 2 hingga NRO1
. Tabel 1 angka harus dalam NRO
, tabel 2 nomor harus dalam NRO1
.
Setelah terhubung ke ODBC saya mengisi satu tabel dengan data dari Tabel 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);
}
maka saya mendapatkan data dari Tabel 2 lain dan menggabungkannya dengan:
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);
}
Setelah itu saya melakukan pemfilteran (saya harus memiliki baris yang hanya dimulai dengan 4 dan 1 NRO
, ada juga baris dengan nomor awal lainnya):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Lalu saya menambahkan satu Kolom lagi untuk NRO1
(ini juga menambahkan nol (0) Saya tidak membutuhkannya di Kolom 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
}
Saya dapat menangkap duplikat dengan kode ini
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
tetapi bagaimana melakukan sisanya? Ini harus dilakukan oleh lingkaran dengan membangun tabel baru? Bagaimana saya dapat melakukan bergabung dan menghapus duplikat dataTable
?
dataTable
berisi lebih dari dua duplikat untuk beberapa nama? Misalnya, apakah mungkin ada tiga duplikat untuk BMW? 2. Bagaimana kita bisa menentukan catatan duplikat mana yang akan disimpan, dan mana yang akan dihapus? Misalnya, kita dapat menyimpan catatan dengan minimumNRO
dan menghapus catatan lainnya.NAME
. Jika lebih dari dua - kesalahan (penangan kesalahan). 2. Ada kesalahan dalam contoh saya, saya telah memperbaikinya sekarang. Terima kasih telah menyebutkan yang ini, ini penting.Jawaban:
Anda bisa mengganti
merge()
panggilan dengan metode kustom, yang melakukan penggabungan dan pemfilteran pada saat yang sama. Lihat contoh di bawah ini. Saya pikir ini adalah pendekatan yang lebih baik daripada penggabungan pertama (memperkenalkan baris duplikat di tabel hasil) dan kemudian menyaring (yaitu menghapus baris duplikat).Di sini, diasumsikan bahwa semua parameter memiliki format yang sama. The
tTemp
table digunakan sebagai penyimpanan sementara untuk isi tabelt2
tetapi dengan kolom tambahan. Ini memungkinkan mengimpor baris di tabel hasil.Mungkin ada solusi yang lebih elegan, tetapi ini harus berfungsi sebagaimana dimaksud. Harap perhatikan bahwa saya telah mengabaikan persyaratan tambahan Anda mengenai nilai yang diizinkan untuk
NRO
, yang saya yakin dapat Anda tambahkan dengan mudah.sumber
'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?)
setelah digantidataTable.Merge(newTable);
olehdataTable.Merge_it(newTable);
class Merger {...}
kode saya dan teleponMerger.merge_it(...)
. Anda harus menyiapkan parameter input.using
arahan yang hilang , tentu saja. Itu hanya cuplikan (dari program kerja).Coba ini:
Tetapkan nilai default 0 dari NRO1 untuk Table1 (ubah queryStringSE)
mis: SELECT NRO, 0 AS NRO1, NAME, NAMEA, NAMEB, ... DARI TABLE1
Tetapkan nilai default 0 dari NRO untuk Table2 (ubah queryStringFI)
mis .: SELECT 0 AS NRO, NRO AS NRO1, NAME, NAMEA, NAMEB, ...... DARI TABLE2
Table1 akan terlihat seperti:
Table2 akan terlihat seperti:
Tambahkan baris kode berikut:
sumber
Anda bisa menyimpan nama kolom yang sama di kedua tabel jika mereka menunjukkan jenis entitas yang sama kemudian lihat kode ini
sumber