使用dataset.readxml在数据表中定义嵌套关系

时间:2014-08-06 19:13:39

标签: c# xml datatable

我想使用dataset.readXML(filename)

将我的xml读入数据集

想法是加载2个表,并使用LINQ加入它们并将查询结果转储到sql数据库中。

我有以下xml

<Report>
    <Parameters>
        <Code>ABC</Code>
        <Expiries>
            <date>2000-01-01</date>
            <time>08:00:00</time>
            <reason>The guy liked cake</reason>
        </Expiries>
        <Expiries>
            <date>2002-01-01</date>
            <time>08:00:00</time>
            <reason>The guy still liked cake</reason>
        </Expiries>
    </Parameters>
    <Parameters>
        <Code>BCA</Code>
        <Expiries>
            <date>2000-01-01</date>
            <time>08:00:00</time>
            <reason>The guy liked cake</reason>
        </Expiries>
        <Expiries>
            <date>2002-01-01</date>
            <time>08:00:00</time>
            <reason>The guy still liked cake</reason>
        </Expiries>
    </Parameters>
</Report>

我将数据表定义为:( addcolumn是添加列的便捷方法)

public DataTable Parameters = new DataTable("Parameters")
    .addColumn<string>("Code")

 public DataTable Expiries = new DataTable("Parameters")
    .addColumn<string>("date")
    .addColumn<string>("time")
    .addColumn<string>("reason")

然后使用以下内容将其导入表中:

DataSet tds = new DataSet()
tds.Tables.add(Parameters);
tds.Tables.add(Expiries);

tds.ReadXML(file.FullName)
//now a record on tds.tables["Parameters"] will have Code="ABC"

这一切都很出色,但它抛弃了我的到期和我的参数之间的关系。 如果我在不使用已定义列的情况下执行此操作,则会自动在2个表之间创建关系,例如

DataSet tds = new DataSet()

tds.ReadXML(file.FullName)
//now a record on tds.tables["Parameters"] will have Code="ABC", Parameter_Id=0

如何在数据表定义中定义此关系,以便模仿自动生成的架构具有什么?

1 个答案:

答案 0 :(得分:2)

假设代码是唯一的,您可以执行以下操作:

        DataSet custom = new DataSet();
        DataTable Parameters = new DataTable("Parameters")
            .AddColumn<string>("Code");

        DataTable Expiries = new DataTable("Expiries")
            .AddColumn<string>("Code")
            .AddColumn<string>("date")
            .AddColumn<string>("time")
            .AddColumn<string>("reason");
        custom.Tables.Add(Parameters);
        custom.Tables.Add(Expiries);
        custom.Relations.Add(new DataRelation("ParameterExpiries", Parameters.Columns["Code"], Expiries.Columns["Code"]));
        custom.Relations["ParameterExpiries"].Nested = true;

这将为您提供一个expiries表,其中包含从父

定义的代码

如果Code不是唯一的,那么您可以在Parameters中创建另一列AutoIncrement = true(例如&#34; ID&#34;)并在父子关系中使用它。然后在Expiries&#34; Code&#34;中添加另一列。它使用表达式&#34; Parent.Code&#34;。

        DataSet custom = new DataSet();
        DataTable Parameters = new DataTable("Parameters")
            .AddColumn<string>("Code")
            .AddColumn<int>("ID");
        Parameters.Columns["ID"].AutoIncrement = true;

        DataTable Expiries = new DataTable("Expiries")
            .AddColumn<int>("ID")
            .AddColumn<string>("Code")
            .AddColumn<string>("date")
            .AddColumn<string>("time")
            .AddColumn<string>("reason");
        custom.Tables.Add(Parameters);
        custom.Tables.Add(Expiries);
        custom.Relations.Add(new DataRelation("ParameterExpiries", Parameters.Columns["ID"], Expiries.Columns["ID"]));
        custom.Relations["ParameterExpiries"].Nested = true;
        Expiries.Columns["Code"].Expression = "Parent.Code";

对于表达式,请参阅:http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression(v=vs.110).aspx

对于datarelation,请参阅:http://msdn.microsoft.com/en-us/library/system.data.datarelation(v=vs.110).aspx