webForumDet fria alternativet

Traversera ett DataSet

0 svar · 464 visningar · startad av Ramzeus

RamzeusMedlem sedan mars 200642 inlägg
#1

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:

	// 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;
	}
126 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)