Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用dataset.readxml在datatables中定义嵌套关系_C#_Xml_Datatable - Fatal编程技术网

C# 使用dataset.readxml在datatables中定义嵌套关系

C# 使用dataset.readxml在datatables中定义嵌套关系,c#,xml,datatable,C#,Xml,Datatable,我想使用dataset.readXML(文件名)将xml读入数据集 其思想是加载这两个表,然后使用LINQ连接它们并将查询结果转储到sql数据库中 我有以下xml <Report> <Parameters> <Code>ABC</Code> <Expiries> <date>2000-01-01</date> <time

我想使用dataset.readXML(文件名)将xml读入数据集

其思想是加载这两个表,然后使用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>
我对datatable的定义如下:(addcolumn是一种添加列的方便方法)

这一切都非常有效,但它抛弃了我的到期日和参数之间的关系。 如果我不使用定义的列,它会自动在两个表之间创建一个关系

DataSet tds = new DataSet()

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

如何在datatable定义中定义此关系,以便它模仿自动生成的模式?

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

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"
        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;
DataSet custom=新数据集();
数据表参数=新数据表(“参数”)
.AddColumn(“代码”);
DataTable Expiries=新数据表(“Expiries”)
.AddColumn(“代码”)
.AddColumn(“日期”)
.AddColumn(“时间”)
.AddColumn(“原因”);
自定义.Tables.Add(参数);
自定义.Tables.Add(过期);
custom.Relations.Add(新的数据关系(“ParameterExpries”,Parameters.Columns[“Code”],Expires.Columns[“Code”]);
custom.Relations[“ParameterExpries”].Nested=true;
这将为您提供一个expires表,其中包含从父级定义的代码

如果代码不是唯一的,那么您可以在参数中创建另一列,该列为AutoIncrement=true(例如“ID”),并在父子关系中使用它。然后在expires“Code”中添加另一列,该列使用表达式“Parent.Code”

DataSet custom=新数据集();
数据表参数=新数据表(“参数”)
.AddColumn(“代码”)
.AddColumn(“ID”);
Parameters.Columns[“ID”]。AutoIncrement=true;
DataTable Expiries=新数据表(“Expiries”)
.AddColumn(“ID”)
.AddColumn(“代码”)
.AddColumn(“日期”)
.AddColumn(“时间”)
.AddColumn(“原因”);
自定义.Tables.Add(参数);
自定义.Tables.Add(过期);
添加(新的DataRelation(“ParameterExpries”,Parameters.Columns[“ID”],Expireies.Columns[“ID”]);
custom.Relations[“ParameterExpries”].Nested=true;
expireies.Columns[“Code”].Expression=“Parent.Code”;
有关表达式,请参见:


有关datarelation,请参见:

是否尝试创建2个表一个仅包含代码列(参数表),另一个包含日期、时间和原因列(到期表)。尝试进行内部联接(因此输出为1个表)
        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;
        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";