我有一个XML文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" <xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="UsersPreferenceSettingsDT">
<xs:complexType>
<xs:sequence>
<xs:element name="USERPROFILEID" type="xs:int" minOccurs="0" />
<xs:element name="SCREENAMEID" type="xs:int" minOccurs="0" />
<xs:element name="FREEZEDCOLUMNID" type="xs:string" minOccurs="0" />
<xs:element name="ORDEROFCOLUMNS" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<UsersPreferenceSettingsDT>
<USERPROFILEID>219</USERPROFILEID>
<SCREENAMEID>1</SCREENAMEID>
<FREEZEDCOLUMNID>2|3|4|5</FREEZEDCOLUMNID>
<ORDEROFCOLUMNS>1</ORDEROFCOLUMNS>
</UsersPreferenceSettingsDT>
<UsersPreferenceSettingsDT>
<USERPROFILEID>123</USERPROFILEID>
<SCREENAMEID></SCREENAMEID>
<FREEZEDCOLUMNID>s|s|s</FREEZEDCOLUMNID>
<ORDEROFCOLUMNS></ORDEROFCOLUMNS>
</UsersPreferenceSettingsDT>
</NewDataSet>
因为我必须更新XML元素(i,e USERPROFILeID = 219,USERPROFILEID是唯一的)。同时,另一个用户也更新相同的XML文件但不同的XML元素(i,e USERPROFILEID = 123)。 XML如何反映用户XML更新(如SQL或ORACLE DB Update)。我使用以下代码进行更新。
userPreferenceSettingsDS.WriteXml(userPreferenceSettingsXMLFilePath, XmlWriteMode.WriteSchema);
但它仅反映最后一次用户配置文件更新值,而多个用户同时更新XML。有谁引导我走出这些问题?
答案 0 :(得分:1)
好吧,因为我们正在讨论的是xml文件而不是数据库,所以除非你总是从文件加载而不是从内存加载,否则你将无法获得数据的“最新”版本,但即使这样你也暴露自己并发问题。
这里最好的选择是切换到数据库,或者实现类似于为所有用户提供服务的Singleton Repository,这样你就会总是返回xml中数据的最新值。
它会解决您的其他问题,当您写入文件时,您将编写包含多个用户更改的数据的“合并”版本。
XML作为数据库的资源:
http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/346a2816-faae-461d-aaa8-235d9c0dd55c
http://bytes.com/topic/c-sharp/answers/460625-c-pure-xml-database
答案 1 :(得分:0)
或者每个用户使用一个配置文件。
答案 2 :(得分:0)
您需要确保一次只能进行一次保存操作。
为此,您需要提供一个读取和写入文件的静态(共享)类。这个花哨的新流行语是Singleton实例,但它只是以下内容:
public static class MyXMLAccessor
{
public static void saveTheData()
{
//this method would write the data to the XML file and save it.
}
public static string ReadTheData()
{
//to read the data from the file
}
}
这样,您可以保证在下一个操作开始之前保存一个操作的结果。
更复杂的解决方案是将xml读入应用程序范围数据集,以便它可以像数据库一样工作。然后,您将使用DataSet.ToXML()方法定期将数据集的内容写回文件。
答案 3 :(得分:0)
听起来好像你应该使用XML数据库。您越早采取行动,您将从中获得的利益越多,您花在创建自己不适当的本土解决方案上的花费就越少。