Avatar billede mikkel_strack Nybegynder
16. august 2006 - 13:39 Der er 11 kommentarer og
1 løsning

Gennemløbe dataset og hente værdier ud

Jeg har lidt kvaler med at iterere over et dataset, når det består af tables inde i hinanden.

Et eksempel:
Har et dataset som er genereret ud fra xml-dokumentet nederst.
Jeg vil nu gerne gennemløbe UsedItems og hive fx. name i <item> og firstname i <customer> ud.

I seudocode:

foreach (Tables UsedItem in DataSet)
{
  SkrivPaaSkaerm item.name; //Skrive navn ud fra table item
  SkrivPaaSkaerm customer.name; //Skrive navn ud fra table customer
}

DataSet ud fra xml (kan ses her i en mere læsevenlig version http://www.strack.dk/eksperten.xml )
Jeg har iøvrigt ingen indflydelse på xml-dokumentets opbygning

<?xml version="1.0" encoding="utf-8"?>
<Collection>
  <User>TesteTeste</User>
  <UsedItems>
    <UsedItem>
      <item>
        <number>1</number>
        <name>teste1</name>
      </item>
      <price>1635</price>
      <customer>
        <type>
          <firstname>teste</firstname>
          <lastname>teste</lastname>
        </type>
      </customer>
    </UsedItem>
    <UsedItem>
      <item>
        <number>2</number>
        <name>teste1</name>
      </item>
      <price>2345</price>
      <customer>
        <type>
          <firstname>teste</firstname>
          <lastname>teste</lastname>
        </type>
      </customer>
    </UsedItem>   
    <UsedItem>
      <item>
        <number>3</number>
        <name>teste1</name>
      </item>
      <price>2345</price>
      <customer>
        <type>
          <firstname>teste</firstname>
          <lastname>teste</lastname>
        </type>
      </customer>
    </UsedItem>   
    <UsedItem>
      <item>
        <number>4</number>
        <name>teste1</name>
      </item>
      <price>2345</price>
      <customer>
        <type>
          <firstname>teste</firstname>
          <lastname>teste</lastname>
        </type>
      </customer>
    </UsedItem>           
  </UsedItems>
</Collection>
Avatar billede snepnet Nybegynder
16. august 2006 - 13:44 #1
du kan løbe igennem det hele...

foreach(DataTable table in SomeDataSet.Tables)
{
  foreach(DataRow row in table.Rows)
  {
    string blah = row["somecolumn"].ToString();
  }
}

Mvh
Avatar billede snepnet Nybegynder
16. august 2006 - 13:48 #2
Dit item.Name f.eks.:

DataTable item = ds.Tables["item"];
foreach (DataRow row in item.Rows)
{
    string nem = row["name"].ToString();
}

Mvh
Avatar billede mikkel_strack Nybegynder
16. august 2006 - 13:53 #3
Er jeg klar over, men hvis jeg nu gerne vil ha både item.Name og customer.Firstname fra samme UsedItem??
Skal jeg gennemløbe dem hver for sig, og smide det i et array eller??
Avatar billede snepnet Nybegynder
16. august 2006 - 13:59 #4
Du kan lægge de relationer ind i dataset'et som du ønsker (og som går godt) - og kan du hente med f.eks. someRow.GetChildRows("relationname");
Mvh
Avatar billede snepnet Nybegynder
16. august 2006 - 14:00 #5
DataSet'et har en .Relations property.
Mvh
Avatar billede mikkel_strack Nybegynder
16. august 2006 - 14:03 #6
Takker...jeg giver det lige et skud med relationerne :)
Avatar billede mikkel_strack Nybegynder
16. august 2006 - 17:23 #7
Jeg kan simpelthen ikke overskue det der dataset. Jeg må droppe relationerne.

Tror løsningen (som jeg ikke bryder mig meget om) må blive at gennemløbe dataset lidt flere gange, og så samle værdierne op i et objekt som blir smidt i en liste.

Men hvis du smider et svar så kvitterer jeg for deltagelsen med halvdelen.

Mikkel
Avatar billede snepnet Nybegynder
16. august 2006 - 21:09 #8
Næh... Det kan jeg egentlig godt forstå at du ikke kan.
Prøv at generér et skema ved at kalde .WriteXmlSchema(<filsti>) på dit dataset, eller benyt værktøjet xsd.exe fra en vs commandprompt.
Den giver dig et skema der fortæller at - nå det kan du selv se, men det giver dig mulighed for at nå firstname sådan her:

DataSet ds = new DataSet();
ds.ReadXml(@"C:\testfiles\somedata.xml");

DataTable item = ds.Tables["item"];

foreach (DataRow row in item.Rows)
{
    StringBuilder builder = new StringBuilder();
    builder.Append(row["name"].ToString());
    builder.Append(" : ");

    // find firstname
    DataRow usedItem = row.GetParentRow("UsedItem_item");
    DataRow[] customers = usedItem.GetChildRows("UsedItem_customer");
    foreach (DataRow customer in customers)
    {
        DataRow[] types = customer.GetChildRows("customer_type");

        foreach (DataRow type in types)
        {
            builder.Append(type["firstname"].ToString());
            builder.Append(",");
        }
    }

    Response.Write(builder.ToString());
}

Og det er ikke ligefrem fordi det giver dig en 1 til 1 mellem de noder du nævner.

Er det meningen det skal være sådan?

Mvh
Avatar billede mikkel_strack Nybegynder
16. august 2006 - 22:11 #9
Jeg har ingen indflydelse på datasettes udformning. XML-dokumenetet importerer jeg fra en anden applikation, og det eksempel jeg viste er iøvrigt en del simplificeret.

Har det generelt skidt med at gennemløbe noget som helst mere end højst nødvendigt, men jeg tror jeg kommer til at glo mig selv ihjel hvis jeg skal forsøge at skabe meningsfylde relationer i de data jeg har til rådighed.

Men tak for input. Selv i de situationer hvor man ikke får løst sit problem, blir man jo tit stadig klogere :o)
Avatar billede snepnet Nybegynder
16. august 2006 - 22:35 #10
Well... det jeg har sendt henter sådan set de data ud du bad om, så det er vel for så vidt en mulig løsning eller?
Mvh
Avatar billede snepnet Nybegynder
16. august 2006 - 22:38 #11
Det kode jeg har sendt skulle du meget gerne kunne bruge direkte... Du skal ikke gøre andet end det.
Det med xsd.exe var mere hvis du ville have et grafisk overblik i vs.
Mvh
Avatar billede mikkel_strack Nybegynder
17. august 2006 - 09:14 #12
Ohh...det var ikke sådan jeg lige forstod det. Troede det bare var sån et overbliksværktøj.

Vil jeg forsøge mig frem med. Takker :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester