【问题标题】: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>