1

XML ファイルが 1 つあります。

<?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 ファイルについて話しているので、常にメモリからではなくファイルからロードしない限り、データの「最新」バージョンを取得することはできませんが、それでも並行性の問題にさらされます。

ここでの最良の選択は、データベースに切り替えるか、すべてのユーザーにサービスを提供するシングルトン リポジトリのようなものを実装することです。そうすれば、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

一度に 1 つの保存操作しか実行できないようにする必要があります。

これを行うには、ファイルの読み取りと書き込みを行う静的 (共有) クラスを提供する必要があります。これに対する派手な新しいバズワードは 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
    }
}

このようにして、次の操作が開始される前に、1 つの操作の結果が保存されることが保証されます。

より複雑な解決策は、xml をアプリケーション スコープのデータセットに読み取って、データベースのように機能させることです。次に、DataSet.ToXML() メソッドを使用して、定期的にデータセットの内容をファイルに書き戻します。

于 2013-01-28T08:04:47.550 に答える
0

または、ユーザーごとに 1 つのプロファイル ファイルを使用します。

于 2013-01-28T07:57:42.730 に答える
0

XML データベースを使用する必要があるように思えます。移行が早ければ早いほど、そこから得られるメリットが大きくなり、独自の不十分な自家製ソリューションの作成に費やす費用が減ります。

于 2013-01-28T14:26:56.733 に答える