Tout d'abord, je dois obtenir toutes les données d'ODBC (cela fonctionne déjà).
Vient ensuite la partie la plus compliquée dont je ne sais pas encore comment cela peut être fait. Il y a deux tables de données dans ODBC. Je les fusionne avec mon code actuel et les filtre avec certains paramètres.
Tableau 1 dans la base de données:
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
Tableau 2 dans la base de données:
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
La table de données fusionnée ressemble à ceci:
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
Cependant, la table de données de sortie fusionnée devrait ressembler à ceci (pour avoir la possibilité de travailler avec elle plus loin):
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
Trouvez des doublons dans NAME
. Ne laissez qu'un seul d'entre eux, attribuez un numéro du tableau 1 au NRO
tableau 2 à NRO1
. Les chiffres du tableau 1 doivent être en NRO
, les chiffres du tableau 2 doivent être en NRO1
.
Après la connexion à ODBC, je remplis un tableau avec les données du tableau 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);
}
puis j'obtiens des données d'un autre tableau 2 et les fusionne en:
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);
}
Après cela, j'effectue le filtrage (je dois avoir des lignes commençant uniquement par 4 et 1 NRO
, il y a aussi des lignes avec un autre numéro de départ):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Ensuite, j'ajoute une autre colonne pour NRO1
(cela ajoute également des zéros (0), je n'en ai pas besoin dans la colonne 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
}
Je peux attraper des doublons avec ce code
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
mais comment faire le reste? Cela devrait être effectué par une boucle avec la construction d'une nouvelle table? Comment puis-je joindre et supprimer des doublons dataTable
?
dataTable
contenir plus de deux doublons pour un nom? Par exemple, est-il possible d'exister trois doublons pour BMW? 2. Comment pouvons-nous définir lequel des enregistrements en double à conserver et lequel supprimer? Par exemple, nous pouvons conserver un enregistrement avec un minimumNRO
et supprimer l'autre enregistrement.NAME
. Si plus de deux - erreur (gestionnaire d'erreurs). 2. Il y avait une erreur dans mon exemple, je l'ai corrigée maintenant. Merci d'avoir mentionné celui-ci, il est important.Réponses:
Vous pouvez remplacer l'
merge()
appel par une méthode personnalisée, qui effectue la fusion et le filtrage en même temps. Voir l'exemple ci-dessous. Je pense que c'est une meilleure approche que la première fusion (introduction de lignes en double dans le tableau des résultats) puis le filtrage (c'est-à-dire la suppression des lignes en double).Ici, on suppose que les paramètres ont tous le même format. La
tTemp
table est utilisée comme stockage temporaire pour le contenu de la tablet2
mais avec la colonne supplémentaire. Cela permet d'importer les lignes dans le tableau de résultats.Il existe peut-être une solution plus élégante, mais cela devrait fonctionner comme prévu. Veuillez noter que j'ai omis votre exigence supplémentaire concernant les valeurs autorisées pour
NRO
, que je suis sûr que vous pouvez ajouter facilement.la source
'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?)
après avoir remplacédataTable.Merge(newTable);
pardataTable.Merge_it(newTable);
class Merger {...}
mon code et appelezMerger.merge_it(...)
. Vous devez cependant préparer les paramètres d'entrée.using
bien sûr ajouter les directives manquantes . C'est juste un extrait (d'un programme de travail).Essaye ça:
Définir la valeur par défaut 0 de NRO1 pour Table1 (modifier queryStringSE)
par exemple: SELECT NRO, 0 AS NRO1, NAME, NAMEA, NAMEB, ... FROM TABLE1
Définir la valeur par défaut 0 de NRO pour Table2 (modifier queryStringFI)
Par exemple: SELECT 0 AS NRO, NRO AS NRO1, NAME, NAMEA, NAMEB, ...... FROM TABLE2
Le tableau 1 ressemblera à:
Le tableau 2 ressemblera à:
Ajoutez les lignes de code suivantes:
la source
vous pouvez conserver le même nom de colonne dans les deux tables si elles dénotent le même type d'entité alors voyez ce code
la source