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# 嵌套数据表_C#_Xml_Datatable_Dataset - Fatal编程技术网

C# 嵌套数据表

C# 嵌套数据表,c#,xml,datatable,dataset,C#,Xml,Datatable,Dataset,我想将一个数据表嵌套到另一个数据表中,如下所示: <Mail> <SMTP> <Server>smtp.myserver.de</Server> <Port>25</Port> <Security>STARTTLS</Security> <Authmethod>Login</Authmethod> </SMTP>

我想将一个数据表嵌套到另一个数据表中,如下所示:

<Mail>
  <SMTP>
    <Server>smtp.myserver.de</Server>
      <Port>25</Port>
    <Security>STARTTLS</Security>
      <Authmethod>Login</Authmethod>
  </SMTP>
  <IMAP>
    <Server>imap.myserver.de</Server>
      <Port>993</Port>
      <Security>STARTTLS</Security>
      <Authmethod>Login</Authmethod>
  </IMAP>
  <Username>myusername</Username>
  <Password>mypassword</Password>
  <Mailaddress>me@myserver.de</Mailaddress>
</Mail>
如果我做对了,将SMTP和IMAP表添加到我的主表Mail就足够了。不幸的是,它不起作用,我只得到:

<Mail>
  <Username>SMTP</Username>
</Mail-Configuration>
<Mail-Configuration>
  <Username>IMAP</Username>
</Mail>
<Mail>
  <Username>myusername</Username>
  <Password>mypassword</Password>
  <Mailaddress>me@myserver.de</Mailaddress>
</Mail>
如果datatables不需要首先生成xml,那么datatables的结构就不应该如此。应该将它们放入数据集中并添加关系。这确保了适当的组织


对于xml生成,最好使用其他工具,如。

看起来您正在尝试将dtsmtp和dtimap作为行添加到dt数据表中。要获得结构,我认为您需要将smtp和imap列添加到dt datatable中,然后在添加其他数据时添加dtsmtp和dtimap

dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add("smtp", typeof(DataTable));
dt.Columns.Add("imap", typeof(DataTable));

dtsmtp.Rows.Add("smtp.myserver.de", "25", "STARTTLS", "Password");
dtimap.Rows.Add("imap.myserver.de", "993", "STARTTLS", "Password");

dt.Rows.Add("myusername", "mypassword", "me@myserver.de", dtsmtp, dtimap);

我不确定要使用什么方法将其转换为XML,但这是您想要的结构。

尝试在数据集中添加所有表,并使用唯一标识列在表之间创建关系

//Create new unique column to maintain relationship between tables
DataColumn dtId = new DataColumn("Id"); //it act as primary key
dtId.ColumnMapping = MappingType.Hidden; //hide mapping column while generating xml

DataColumn dcimap_dtId = new DataColumn("Mail_Id"); // foreign key
dcimap_dtId.ColumnMapping = MappingType.Hidden;

DataColumn dcsmtp_dtId = new DataColumn("Mail_Id"); // foreign key
dcsmtp_id.ColumnMapping = MappingType.Hidden;

// add newly created columns into appropriate tables and position
...
//fill data rows as per data table column arrangement
dt.Rows.Add(1, "myusername", "mypassword", "me@myserver.de"); // 1 is primary key
dtsmtp.Rows.Add("smtp.myserver.de", "25", "STARTTLS", "Password", 1); // 1 is here act as foreign key
dtimap.Rows.Add("imap.myserver.de", "993", "STARTTLS", "Password", 1);

// add all tables inside the dataset
ds.Tables.Add(dt);
ds.Tables.Add(dtsmtp);
ds.Tables.Add(dtimap);

//create relationship between tables
DataRelation relation = new DataRelation("Mail_SMTP", dtId, dcsmtp_dtId, true);
relation.Nested = true;
ds.Relations.Add(relation);

DataRelation relation1 = new DataRelation("Mail_IMAP", dtId, dcimap_dtId, true);
relation1.Nested = true;
ds.Relations.Add(relation1);

//Write to file
ds.WriteXml("file.xml");
参考:


-SJ

顺便说一句,这一切似乎有点糟糕。几乎可以肯定的是,有一种更好的方法可以在不嵌套数据表的情况下实现您的目标。正如您在上面的编辑中所看到的:我不知道如何正确地将关系添加到我的行中。我试过:dt.Rows.Addmyusername,mypassword,me@myserver.de关系,关系1;但是writeXML产生:。。。。。。。。。因此,SMTP&IMAP并没有像预期的那样嵌套到邮件中,您不需要将关系对象添加为表列;而是将关系对象添加到数据集。请参阅更新的代码片段,它将帮助您如何向datatable添加新行。如果你还面临问题,请告诉我嘿,忍者代码,太好了。最后,我设法将SMTP和IMAP嵌套到邮件中。不幸的是,writeXML打印出关系列。我得到:1。。。1.1如何隐藏关系列?需要将ColumnMapping类型值设置为hidden。请参阅更新解决方案。
ds.Tables.Add(dt);
ds.Tables.Add(dtimap);
ds.Tables.Add(dtsmtp);

DataRelation relation = new DataRelation("Mail_SMTP", dtsmtpId, dcsmtpdtId, true);
relation.Nested = true;
ds.Relations.Add(relation);

DataRelation relation1 = new DataRelation("Mail_IMAP", dtimapid, dcimapdtId, true);
relation1.Nested = true;
ds.Relations.Add(relation1);

dt.Rows.Add("myusername", "mypassword", "me@myserver.de", relation, relation1);
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add("smtp", typeof(DataTable));
dt.Columns.Add("imap", typeof(DataTable));

dtsmtp.Rows.Add("smtp.myserver.de", "25", "STARTTLS", "Password");
dtimap.Rows.Add("imap.myserver.de", "993", "STARTTLS", "Password");

dt.Rows.Add("myusername", "mypassword", "me@myserver.de", dtsmtp, dtimap);
//Create new unique column to maintain relationship between tables
DataColumn dtId = new DataColumn("Id"); //it act as primary key
dtId.ColumnMapping = MappingType.Hidden; //hide mapping column while generating xml

DataColumn dcimap_dtId = new DataColumn("Mail_Id"); // foreign key
dcimap_dtId.ColumnMapping = MappingType.Hidden;

DataColumn dcsmtp_dtId = new DataColumn("Mail_Id"); // foreign key
dcsmtp_id.ColumnMapping = MappingType.Hidden;

// add newly created columns into appropriate tables and position
...
//fill data rows as per data table column arrangement
dt.Rows.Add(1, "myusername", "mypassword", "me@myserver.de"); // 1 is primary key
dtsmtp.Rows.Add("smtp.myserver.de", "25", "STARTTLS", "Password", 1); // 1 is here act as foreign key
dtimap.Rows.Add("imap.myserver.de", "993", "STARTTLS", "Password", 1);

// add all tables inside the dataset
ds.Tables.Add(dt);
ds.Tables.Add(dtsmtp);
ds.Tables.Add(dtimap);

//create relationship between tables
DataRelation relation = new DataRelation("Mail_SMTP", dtId, dcsmtp_dtId, true);
relation.Nested = true;
ds.Relations.Add(relation);

DataRelation relation1 = new DataRelation("Mail_IMAP", dtId, dcimap_dtId, true);
relation1.Nested = true;
ds.Relations.Add(relation1);

//Write to file
ds.WriteXml("file.xml");