Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#] 2 datasets mergen en als 1 tabel weergeven in datagrid?

Pagina: 1
Acties:

  • Erwin_Br
  • Registratie: Oktober 2005
  • Laatst online: 17-11 14:08
Ik heb 1 dataset. Hierin zitten 2 tabellen die uit 2 verschillende SQL servers gevuld worden middels 2 data adapters. Beide tabellen hebben verschillende informatie, maar 1 overeenkomstig veld: een ID.

Nu wil ik in een datagrid beide tabellen als 1 tabel weergeven. De informatie moet aan elkaar gekoppeld worden op regelniveau met als link het ID. Ik heb me wezenloos gezocht, maar weinig gevonden.

Wat heb ik al geprobeerd? Nou, naar aanleiding van een artikel dat ik vond heb ik 2 datasets gemaakt i.p.v. 1, en deze proberen te mergen middels een primary key (het ID, dus). Het resultaat was dat ik 1 gemergde dataset kreeg, maar daarin zaten de 2 tabellen weer gescheiden van elkaar. Zoals ik ben begonnen, dus. Aargh! Ik ben een dag aan het Googlen geweest zonder noemenswaardig resultaat.

Wie kan mij verder helpen? Mijn dank zal groot zijn.

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 13-11 10:30

mOrPhie

❤️❤️❤️❤️🤍

Waarom staat het resultaat in 2 datasets? Kun je niet aggregeren of gewoonweg een join doen in je query?

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
De class DataTable kent ook een Merge methode. Misschien kan deze je helpen?

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 13-11 10:30

mOrPhie

❤️❤️❤️❤️🤍

Face_-_LeSS schreef op dinsdag 29 juli 2008 @ 15:20:
De class DataTable kent ook een Merge methode. Misschien kan deze je helpen?
Merge is alleen voor het gebruik bij overeenkomstige schema's. Volgens mij wil de TS juist een tabel uitbreiden met extra kolommen uit een andere tabel: ergo, een join.

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
mOrPhie schreef op dinsdag 29 juli 2008 @ 15:24:
[...]


Merge is alleen voor het gebruik bij overeenkomstige schema's. Volgens mij wil de TS juist een tabel uitbreiden met extra kolommen uit een andere tabel: ergo, een join.
Daarvoor is er een overload met een parameter van het type: MissingSchemaAction voor zover ik me kan herinneren.

Zoiets:
C#:
1
2
3
4
DataSet ds;
// init dataset en laad data;

ds.Tables["Table1"].Merge(s.Tables["Table2"], false, MissingSchemaAction.Add);

[ Voor 16% gewijzigd door Face_-_LeSS op 29-07-2008 15:41 ]


  • Erwin_Br
  • Registratie: Oktober 2005
  • Laatst online: 17-11 14:08
mOrphie: Een join in m'n query klinkt interessant. Als ik tabel1 al in mijn dataset heb zitten, kan ik dan tabel2 in dezelfde dataset vullen met gegevens uit de server (via SqlDataAdapter) + gegevens uit tabel1?

Overigens had ik in mijn originele opzet maar 1 dataset, en wilde ik de 2 tabellen uit die dataset samenvoegen tot 1 tabel. Ik wist alleen niet hoe. Naar aanleiding van diverse voorbeelden ben ik dus overgestapt op 2 aparte datasets, en die middels primary keys en de merge functie proberen samen te voegen (zie code voorbeeld hieronder)

Face_-_Less: Dat heb ik dus geprobeerd. Ik weet niet of ik het goed heb gedaan, maar hier is een snippet:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
//Opzetten van SqlConnection, DataSet, en SqlDataAdapter is hier weggelaten... En dan doe ik dit:

DataColumn[] pk1 = new DataColumn[] { dsMaximo.Tables["tblTurbine"].Columns["eqnum"] };
            dsMaximo.Tables["tblTurbine"].PrimaryKey = pk1;

            DataColumn[] pk2 = new DataColumn[] { dsLocal.Tables["tblTurbineAdditional"].Columns["Turbinenr"] };
            dsLocal.Tables["tblTurbineAdditional"].PrimaryKey = pk2;

            dsMaximo.Merge(dsLocal, false, MissingSchemaAction.Add);

            dgMaximo.DataSource = dsMaximo.Tables["tblTurbine"];
            dgMaximo.Update();

[ Voor 0% gewijzigd door Erwin_Br op 29-07-2008 15:49 . Reden: code tag speciferen als C# ]


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Je merged nu twee DataSets met elk één tabel. deze tabelnamen komen niet overeen dus deze twee tabellen zullen nooit gemerged worden op deze manier.

Roep eens Merge aan op de tabel. Dus:

C#:
1
dsMaximo.Tables["tblTurbine"].Merge(dsLocal.Tables["tblTurbineAdditional"], false, MissingSchemaAction.Add);


Of geef de tabellen de zelfde naam.

  • Erwin_Br
  • Registratie: Oktober 2005
  • Laatst online: 17-11 14:08
Bedankt voor de snelle reply. Helaas ben ik er nog niet helemaal uit: ik krijg een nullreference exception. Enig idee waar die in deze context vandaan kan komen? Ik heb gechecked dat:

- Alle rijen hebben een uniek ID, in beide tabellen. (geen dubbele ID's dus)
- Alle rijen hebben een tegenhanger in beide tabellen
- De datasets worden gewoon gevuld
- De datatypen van beide ID's zijn hetzelfde

Zie ik nog iets over het hoofd? De code ziet er nu zo uit:

C#:
1
2
3
4
5
6
7
8
9
10
DataColumn[] pk1 = new DataColumn[] { dsMaximo.Tables["tblTurbine"].Columns["eqnum"] };
            dsMaximo.Tables["tblTurbine"].PrimaryKey = pk1;

            DataColumn[] pk2 = new DataColumn[] { dsLocal.Tables["tblTurbineAdditional"].Columns["Turbinenr"] };
            dsLocal.Tables["tblTurbineAdditional"].PrimaryKey = pk2;
            
            dsMaximo.Tables["tblTurbine"].Merge(dsLocal.Tables["tblTurbineAdditional"], false, MissingSchemaAction.Add);

            dgMaximo.DataSource = dsMaximo.Tables["tblTurbine"];
            dgMaximo.Update();


Regel 7 geeft dus die exception...

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:02

TeeDee

CQB 241

Step eens regel voor regel door de code heen, kijk welke elementen null zijn voordat je ze gebruikt. Is pk2 niet null?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Erwin_Br
  • Registratie: Oktober 2005
  • Laatst online: 17-11 14:08
De PK's lijken gevuld zover ik dat kan beoordelen. Ze staan als volgt in m'n watch window:
code:
1
2
pk1 {Dimensions:[1]}    System.Data.DataColumn[]
pk2 {Dimensions:[1]}    System.Data.DataColumn[]


(Om het error tracken wat te versimpelen heb ik nu maar 1 regel in beide datasets door het ID mee te geven in de WHERE statement van de sql string, vandaar...)

Als ik de PK's weghaal dan doet hij het overigens wel, maar heb ik 2 regels in mijn datagrid, i.p.v. 1. Lijkt me logisch, omdat hij geen match maakt op basis van het ID.

Het probleem lijkt dus voort te komen uit mijn primary keys. Maar wat zie ik dan over het hoofd?

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Geef de primary key columns eens dezelfde naam. Dus allebei "Turbinenr" of "eqnum". Dat zal je probleem oplossen.

  • Erwin_Br
  • Registratie: Oktober 2005
  • Laatst online: 17-11 14:08
Face_-_LeSS schreef op woensdag 30 juli 2008 @ 11:58:
Geef de primary key columns eens dezelfde naam. Dus allebei "Turbinenr" of "eqnum". Dat zal je probleem oplossen.
Thanks! Dat is dus inderdaad de oplossing.

Weet je toevallig ook wat er gebeurt als tabel1 (wat eigenlijk de "leidende" tabel is) records heeft die niet voorkomen in tabel2 (die de extra info bevat)? Laat hij dan de extra velden leeg, of gaat -ie zeuren? En kan ik dat op 1 of andere manier regelen?

In ieder geval al hartstikke bedankt voor de hulp. Ik ben nu een behoorlijk eind onderweg! :)

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Erwin_Br schreef op woensdag 30 juli 2008 @ 13:41:
[...]

Weet je toevallig ook wat er gebeurt als tabel1 (wat eigenlijk de "leidende" tabel is) records heeft die niet voorkomen in tabel2 (die de extra info bevat)? Laat hij dan de extra velden leeg, of gaat -ie zeuren? En kan ik dat op 1 of andere manier regelen?
Met "MissingSchemaAction.Add" worden de "extra info" kolomen toegevoegd en de missende waarden in de leidende tabel worden geïnitialiseerd op de ingestelde default kolom waarde (welke default op DBNull staat).

Maar dat is prima zelf te testen natuurlijk ;)

  • Erwin_Br
  • Registratie: Oktober 2005
  • Laatst online: 17-11 14:08
Het werkt perfect. De velden blijven inderdaad leeg als ze niet bestaan in de 2e tabel.

Nogmaals bedankt! :)
Pagina: 1