login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[C#] DataRowCollection data uitlezen

Offline Ultimatum - 29/07/2009 19:30 (laatste wijziging 30/07/2009 22:40)
Avatar van UltimatumPHP expert Ey, ik heb de volgende query in MSSQL, deze haalt de data uit 1 tabel en herhaald zichzelf steeds. Hierdoor heb ik een DataTable met 3 kolommen, marketGroupID, parentGroupID en marketGroupName.

Het probleem dat ik nu heb is dat ik hierdoor heen wil lopen en de childs van de parent in een array zetten. De array moet er dan zo uitzien (php voorbeeld omdat ik niet weet hoe ik dit in C# moet doen)
  1. <?php
  2. $items = array(
  3. array(2, 3),
  4. array(5, 6)
  5. );
  6. ?>


Dit is al wat ik heb, niet veel maar hier kan ik alles uitlezen. De eerste rijen hebben dus parentGroupID 204, dit zijn de parents en moeten als eerste in de array staan, daarna moet ik dus de records vinden waarvan de parentGroupID gelijk is aan de marketGroupID van de parent record etc. Hoop dat iemand me kan helpen, zonder voor vage uitleg soms.

  1. private static void getMarketGroups()
  2. {
  3. string select = "WITH marketGroups (marketGroupID, parentGroupID, marketGroupName) AS (\n" +
  4. "SELECT marketGroupID, parentGroupID, marketGroupName \n" +
  5. "FROM invMarketGroups \n" +
  6. "WHERE parentGroupID = 204\n" +
  7.  
  8. "UNION ALL\n" +
  9.  
  10. "SELECT c.marketGroupID, c.parentGroupID, c.marketGroupName\n" +
  11. "FROM invMarketGroups as c\n" +
  12. "INNER JOIN marketGroups as p\n" +
  13. "ON c.parentGroupID = p.marketGroupID\n" +
  14. ")\n" +
  15. "SELECT marketGroupID, parentGroupID, marketGroupName FROM marketGroups\n";
  16. SqlDataAdapter adapter = new SqlDataAdapter(select, connection);
  17. DataTable datatable = new DataTable("datatable");
  18. adapter.Fill(datatable);
  19.  
  20. iterate(datatable.Rows);
  21. }
  22.  
  23. private static void iterate(DataRowCollection rows)
  24. {
  25. foreach (DataRow row in rows)
  26. {
  27. Console.WriteLine(row["marketGroupID"] + " | " + row["parentGroupID"] + " | " + row["marketGroupName"]);
  28. }
  29.  
  30. Console.ReadLine();
  31. }


Alvast bedankt.

Niemand die me kan helpen?

7 antwoorden

Gesponsorde links
Offline wvmaaren - 05/08/2009 11:16
Avatar van wvmaaren Nieuw lid mag ik vragen waarom je de items in een array wil zetten? Wat wil je met die array gaan doen? Wellicht zijn er namelijk makkelijkere oplossingen.
Offline Ultimatum - 05/08/2009 12:04
Avatar van Ultimatum PHP expert Want ik wil data uit de MSSQL database in een SQLite database zetten maar omdat de tabel van de MSSQL database anders is opgebouwd zoals ik in de beginpost zei wil ik eerst de data in een array zetten, zodat ik het makkelijker kan toevoegen in de SQLite applicatie.
Offline wvmaaren - 05/08/2009 13:17 (laatste wijziging 05/08/2009 13:55)
Avatar van wvmaaren Nieuw lid Ik heb wel een C# voorbeeldje hoe ik dit normaal opbouw... Ik gebruik het normaal om een datatable om te parsen naar stringelementen om ze laten in javascript te laden en een grid te vullen.. Maar ik denk dat je met deze code wel voorruit kan.

  1. DataTable dt = _Uren.Fill(); // Ik gebruik hier een fill gekoppeld aan een storedprocedure. Hier ook je vooraf gegenereede datatable inzetten.
  2. int items = dt.Rows.Count; // Rows tellen
  3. int columns = dt.Columns.Count; //Colums tellen
  4. string array = ""; //string definieren voor je je data in gaat zetten. Je kan hier ook een Array voor gebruiken.
  5.  
  6. for (int i = 0; i < items; i++)
  7. {
  8. array += "[";
  9.  
  10. for (int i = 0; i < items; i++)
  11. {
  12. array += "["; //de array begint met een "["
  13.  
  14. for (int c = 0; c < columns; c++)
  15. {
  16. object t = dt.Rows[i][c].GetType().ToString(); //hiermee zoek je het type uit. ivm het parsen van de data. Een string of datatime object zal worden geparsen tussen quotes, een int zonder quotes
  17.  
  18. if ((string)t == "System.String")
  19. array += "'" + dt.Rows[i][c] + "',";
  20. else if ((string)t == "System.Boolean")
  21. {
  22. bool geaccordeerd = (bool)dt.Rows[i][c];
  23. if (geaccordeerd == true)
  24. array += 1 + ",";
  25. else
  26. array += 0 + ",";
  27. }
  28. else if ((string)t == "System.DateTime")
  29. {
  30. array += "'" + ((DateTime)dt.Rows[i][c]).ToShortDateString() + "',"; //Je kan hier natuurlijk diverse formaten kiezen.
  31. }
  32. else
  33. array += dt.Rows[i][c] + ",";
  34. }
  35. array = array.Remove(array.Length - 1, 1);
  36. array += "],";
  37. }
  38. array = array.Remove(array.Length - 1, 1);
  39.  
  40. //array zal nu een string bevatten waarin alle records worden onderscheiden met [].
  41. //voorbeeld:
  42. // [['testdata', 1, 2, '01-01-1990'],['testdata 2', 2, 2, '01-01-1990']]


Een tweede optie is om je MSSQL query uit te breiden en deze al te laten selecten. Je kan de output dus aanpassen.

Ik zou me, als ik jou was, wel eens gaan verdiepen in het werken met stored procodures en eventueel je data afvangen in een losse classe (Data Acces Layer).

Succes!
Offline Ultimatum - 05/08/2009 14:21 (laatste wijziging 05/08/2009 14:21)
Avatar van Ultimatum PHP expert Bedankt voor je code, ik zal vanavond even gaat testen. Wat bedoel je met de optie om MSSQL query uit te breiden?

Tevens moet ik dit eenmalig doen en eventueel om de maand om de nieuwste data te krijgen, maar voor de rest heb ik de MSSQL database niet meer nodig in mijn applicatie.
Offline wvmaaren - 05/08/2009 14:37 (laatste wijziging 05/08/2009 14:39)
Avatar van wvmaaren Nieuw lid Je kan door je query aan te passen, de manier waarop MSSQL zijn data output beinvloeden. Om een voorbeeld te geven:

Ik draai op dit moment een javascriptapplicatie waarin d.m.v. AJAX een grid gevuld wordt. De data vanuit mijn database (een vrij complexe tabel) moet dus worden omgezet naar een array. Ik deed dit voorheen met de bovenstaande code. Nu heb ik mijn stored procudure dus danig aangepast dat hij de rows al als string aanleverd. Ik hoef dus in C# alleen de rijen nog maar aan elkaar te plakken d.m.v. een ordinaire for loop.

Mijn selectstatement ziet er als volgt uit:

  1. SELECT
  2. '[' + ISNULL(CAST([DebiID] AS VARCHAR), '0') + ',' +
  3. ISNULL(CAST([ProjectID] AS VARCHAR), '0') + ',' +
  4. CAST([TicketID] AS VARCHAR) + ',' +
  5. ISNULL(CAST([MedewerkerID] AS VARCHAR), '0') + ',' +
  6. '|' + ISNULL([Opmerking], 'geen') + '|,' +
  7. CAST([SoortUrenID] AS VARCHAR) + ',' +
  8. '|' + SUBSTRING(CONVERT(VARCHAR, [BeginTijd], 8), 1,5) + '|,' +
  9. '|' + SUBSTRING(CONVERT(VARCHAR, [EindTijd], 8), 1, 5)+ '|,' +
  10. CASE [Remote] WHEN 1 THEN 'true,' ELSE 'false,' END +
  11. CASE [Voorrijkosten] WHEN 1 THEN 'true,' ELSE 'false,'END + ISNULL(CASE [Declarabel] WHEN 1 THEN 'true,' ELSE 'false,' END, 'false,') +
  12. CAST([GemaakteUrenID] AS VARCHAR) + '],' AS json
  13. FROM
  14. [tbl Uren Gemaakte]


De datatable die dan gevuld wordt in C# bevat dan maar 1 kolom.

Snap je een beetje wat ik bedoel...
Offline Ultimatum - 05/08/2009 16:09
Avatar van Ultimatum PHP expert Ja, jij verplaatst het C# gedeelte als het ware naar de MSSQL. Het punt is dat de tabel die ik moet uitlezen recursief is ingedeeld, dus alle parent en childs zitten in dezelfde tabel, maar wat ik wil in mijn tabel is de childs van de parent in een nieuwe kolom ipv nieuwe rij. Kan maximaal 5x diep dus dat is geen probleem.

Is dat ook mogelijk met jouw voorbeeld?
Offline wvmaaren - 06/08/2009 08:57
Avatar van wvmaaren Nieuw lid in principe moet dat wel lukken... ik wil je er wel mee helpen. even exact laat weten hoe je tabel er nu uit ziet en wat je nieuwe formaat moet worden... Tabelnamen, soort data, eventuele afhankelijkeheden uit andere tabellen, etc. Dan zal ik kijken of ik de query voor je kan schrijven.

Je kan me eventueel ook toevoegen op msn al je dat makkelijker vind. msn adres staat in mijn profiel.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.201s