---
title: "Traversera ett DataSet"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/152146-traversera-ett-dataset"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Ramzeus"
published: "2006-10-05T14:03:54.000Z"
updated: "2006-10-05T14:03:54.000Z"
replies: 0
views: 464
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/152146-traversera-ett-dataset"
---

# Traversera ett DataSet

## #1 — Ramzeus, 2006-10-05T14:03Z

Jag är nybörjare på .Net (VC).

Mitt problem är att jag vill ladda en XML in i ett DataSet och sedan traversera den och göra saker med det som finns.

Min XML kan t.ex se ut så här:

```
<createData>
<ADK_OOI_HEAD_CUSTOMER_NAME>Patrik</ADK_OOI_HEAD_CUSTOMER_NAME>
<ADK_OOI_HEAD_TEXT1>Testfaktura med två rader</ADK_OOI_HEAD_TEXT1>
<ADK_OOI_HEAD_ROWS>
	<ADK_DB_INVOICE_ROW>
		<ADK_OOI_ROW_TEXT>Fakturarad 1</ADK_OOI_ROW_TEXT>
		<ADK_OOI_ROW_PRICE2>100</ADK_OOI_ROW_PRICE2>
	</ADK_DB_INVOICE_ROW>
	<ADK_DB_INVOICE_ROW>
		<ADK_OOI_ROW_TEXT>Fakturarad 2</ADK_OOI_ROW_TEXT>
		<ADK_OOI_ROW_PRICE2>205</ADK_OOI_ROW_PRICE2>
	</ADK_DB_INVOICE_ROW>
</ADK_OOI_HEAD_ROWS>
</createData>
```

Jag skulle nu vilja loopa igenom alla saker som finns i \<createData\> och som inte har saker under sig (alla utom ADK_OOI_HEAD_ROWS). 
Sedan vill jag gå igenom alla saker under \<ADK_OOI_HEAD_ROWS\> och för alla saker där under så vill jag få fram alla datavärden där (t.ex \<ADK_OOI_ROW_TEXT\>).

Jag har kommit så långt att jag kan få fram kolumnvärden och datavärden från \<createData\>, men sen är det stopp.

**Är det någon som förstår sig på hur ett DataSet fungerar och kan hjälpa mig på traven?**

Så här ser min funktion ut:

```php
	// Description:  Create data in database 
	// Parameters:   type    - Which database to create data in
	//               xmlData - Xml string
	//               writer  - A valid instance of XmlWriter, will contain the XML-code afterwards
	// Return value: XmlWriter resource
	XmlWriter ^SPCSoapClass::_createData(int type, String ^xmlData, XmlWriter ^writer)
	{
		ADK_ERROR error;
		ZeroMemory(&error, sizeof(ADK_ERROR));

		PADK_DATA pData = AdkCreateData(type);

		/*XmlTextReader ^reader = gcnew XmlTextReader(gcnew StringReader(xmlData));
		reader->WhitespaceHandling = WhitespaceHandling::None;

		reader->ReadStartElement();

		// create updateList from XML
		ArrayList ^createList = gcnew ArrayList();
		while (!reader->LocalName->Equals(COMMAND_CREATE_DATA) && !reader->LocalName->Equals(""))
		{
			ArrayList ^item = gcnew ArrayList();
			int field = AdkDbNameToId(AdkDbId(type), reader->LocalName);
			String ^value = reader->ReadString();
			item->Add(field);
			item->Add(value);
			createList->Add(item);
			reader->Read();
		}*/

		DataSet ^xmlDataSet = gcnew DataSet();
		xmlDataSet->ReadXml(gcnew StringReader(xmlData));
		
		int keyFieldId = 0;

		// Set pData structure from createList
		int iTemp=0;
		long int liTemp=0;
		double dTemp=0;
		char *strTemp=0;
		//for (int i=0; i<createList->Count; i++)
		DataTable ^table = xmlDataSet->Tables[0];
		DataRow ^row = table->Rows[0];
		for (int i=0; i<table->Columns->Count; i++)
		{
			DataColumn ^column = table->Columns[i];
			//ArrayList ^item = (ArrayList ^)createList[i];
			//ArrayList ^field = gcnew ArrayList();
			//int fieldId = (int)item[0];
			String ^colName = column->ColumnName;
			int fieldId = AdkDbNameToId(AdkDbId(type), colName);
			//String  ^fieldValue = (String ^)item[1];
			Type ^test = row[colName]->GetType();
			String ^fieldValue = (String ^)row[colName];
			if (AdkIsReadWrite(pData, pData->rgField[fieldId].iFieldId))
			{
				switch(pData->rgField[fieldId].iType) 
				{
					case eBool: // eBool
						iTemp = Convert::ToInt32(fieldValue);
						AdkSetBool(pData, pData->rgField[fieldId].iFieldId, iTemp);
						break;
					case eChar: // eChar
						strTemp = (char*) Marshal::StringToHGlobalAnsi(fieldValue).ToPointer();
						AdkSetStr(pData, pData->rgField[fieldId].iFieldId, strTemp);
						Marshal::FreeHGlobal(IntPtr(strTemp));
						break;
					case eDouble: //eDouble
						dTemp = Convert::ToDouble(fieldValue);
						AdkSetDouble(pData, pData->rgField[fieldId].iFieldId, dTemp);
						break;
					case eDate: // eDate
						try {
							liTemp = Convert::ToInt32(fieldValue);
							AdkSetDate(pData, pData->rgField[fieldId].iFieldId, liTemp);
						}
						catch (...) {
							strTemp = (char*) Marshal::StringToHGlobalAnsi(fieldValue).ToPointer();
							AdkDateToLong(strTemp, &liTemp);
							Marshal::FreeHGlobal(IntPtr(strTemp));
						}
						AdkSetDate(pData, pData->rgField[fieldId].iFieldId, liTemp);
						break;
				};
			}
		}

		error = AdkAdd(pData);
		AdkDeleteStruct(pData);
		if (error.lRc != ADKE_OK)
			SoapResponseError(&error);

		writer->WriteStartElement(COMMAND_CREATE_DATA_RESULT_ELEMENT);
		writer->WriteEndElement();
		writer->Flush();

		return writer;
	}
```

Permalänk: https://www.webforum.nu/p/152146

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/152146-traversera-ett-dataset
