1

我有一个 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 元素(即 USERPROFILEID = 219,USERPROFILEID 是唯一的)。同时另一个用户也更新了相同的 XML 文件但不同的 XML 元素(即 USERPROFILEID=123)。XML 如何反映两个用户的 XML 更新(如 SQL 或 ORACLE DB 更新)。我使用以下代码进行更新。

userPreferenceSettingsDS.WriteXml(userPreferenceSettingsXMLFilePath, XmlWriteMode.WriteSchema);

但它仅反映最后一个用户配置文件更新值,而多个用户同时更新 XML。有人指导我摆脱这些问题吗?

4

4 回答 4

1

好吧,既然我们谈论的是 xml 文件而不是数据库,您将无法获得“最新”版本的数据,除非您总是从文件而不是从内存中加载,但即便如此,您也会面临并发问题。

这里最好的选择是切换到数据库,或者可能实现像 Singleton Repository 这样的服务所有用户的东西,这样您将始终在 xml 中返回数据的最新值。

它会解决您的另一个问题,当您写入文件时,您将写入数据的“合并”版本,其中包含来自多个用户的更改。


XML 作为数据库的资源:

http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/346a2816-faae-461d-aaa8-235d9c0dd55c

C#.net 中的 XML 数据库

http://bytes.com/topic/c-sharp/answers/460625-c-pure-xml-database

于 2013-01-28T07:49:34.807 回答
0

在我看来,您应该使用 XML 数据库。您越早采取行动,您从中获得的好处就越多,而且您在创建自己的不足的本土解决方案上花费的钱就越少。

于 2013-01-28T14:26:56.733 回答
0

或为每个用户使用一个配置文件。

于 2013-01-28T07:57:42.730 回答
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() 方法定期将数据集的内容写回文件。

于 2013-01-28T08:04:47.550 回答