【问题标题】:DataSet Merge without Schema will never override data, right?没有 Schema 的 DataSet Merge 永远不会覆盖数据,对吧?
【发布时间】:2011-09-25 23:31:34
【问题描述】:

我正在使用现有代码并希望在不重新编译的情况下更改数据(因此这可能被视为超级用户问题)

我们目前DataSet.ReadXml 来自一个(已编译的)基于资源的 XML 文件。然后我们检查一个本地 XML 文件,如果存在,DataSet.ReadXml 该文件,然后DataSet.Merge 将结果放入原始文件。

由于我们在编译的基于资源的 XML 中没有架构,所以外部 XML 无法覆盖任何数据,只能添加到它,是吗?

【问题讨论】:

    标签: .net ado.net merge dataset


    【解决方案1】:

    我的问题标题似乎排除了这个选项,但不是有意的:

    可以通过将xs:schema 作为XML 的第一个子元素来获取本地文件的数据以覆盖编译后的文件。

    即当原始数据没有架构时,将使用合并的架构。

    例如

    原文:

    <NewDataSet>
      <dt1>
        <k>1</k>
        <l>test</l>
        <m>1</m>
      </dt1>
      <dt1>
        <k>2</k>
        <l>test</l>
        <m>2</m>
      </dt1>
      <dt1>
        <k>2</k>
        <l>tst</l>
        <m>3</m>
      </dt1>
    </NewDataSet>
    

    新:

    <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="dt1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="k" type="xs:string" />
                  <xs:element name="l" type="xs:string" />
                  <xs:element name="m" type="xs:string" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
        <xs:unique name="Constraint1" msdata:PrimaryKey="true">
          <xs:selector xpath=".//dt1" />
          <xs:field xpath="k" />
          <xs:field xpath="l" />
        </xs:unique>
      </xs:element>
     </xs:schema>
      <dt1>
        <k>1</k>
        <l>test</l>
        <m>1</m>
      </dt1>
      <dt1>
        <k>2</k>
        <l>test</l>
        <m>3</m>
      </dt1>
      <dt1>
        <k>3</k>
        <l>test</l>
        <m>4</m>
      </dt1>
    </NewDataSet>
    

    合并(为简单起见,我包括 WriteXml 输出):

    <NewDataSet>
      <dt1>
        <k>1</k>
        <l>test</l>
        <m>1</m>
      </dt1>
      <dt1>
        <k>2</k>
        <l>test</l>
        <m>3</m>
      </dt1>
      <dt1>
        <k>2</k>
        <l>tst</l>
        <m>3</m>
      </dt1>
      <dt1>
        <k>3</k>
        <l>test</l>
        <m>4</m>
      </dt1>
    </NewDataSet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多