2015-08-27 4 views
0

я хотел бы, чтобы гнездиться в DataTable в другой DataTable, например:вложенности DataTables

<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>[email protected]</Mailaddress> 
</Mail> 

Мой код:

DataTable dt = new DataTable(); 
DataTable dtsmtp = new DataTable(); 
DataTable dtimap = new DataTable(); 
dt.TableName = "Mail"; 
dtsmtp.TableName = "SMTP"; 
dtimap.TableName = "IMAP"; 
DataColumn dcsmtp1 = new DataColumn("Server"); 
DataColumn dcsmtp2 = new DataColumn("Port"); 
DataColumn dcsmtp3 = new DataColumn("Security"); 
DataColumn dcsmtp4 = new DataColumn("Authmethod"); 

DataColumn dcimap1 = new DataColumn("Server"); 
DataColumn dcimap2 = new DataColumn("Port"); 
DataColumn dcimap3 = new DataColumn("Security"); 
DataColumn dcimap4 = new DataColumn("Authmethod"); 

DataColumn dc1 = new DataColumn("Username"); 
DataColumn dc2 = new DataColumn("Password"); 
DataColumn dc3 = new DataColumn("Mailaddress"); 

dtsmtp.Columns.Add(dcsmtp1); 
dtsmtp.Columns.Add(dcsmtp2); 
dtsmtp.Columns.Add(dcsmtp3); 
dtsmtp.Columns.Add(dcsmtp4); 

dtimap.Columns.Add(dcimap1); 
dtimap.Columns.Add(dcimap2); 
dtimap.Columns.Add(dcimap3); 
dtimap.Columns.Add(dcimap4); 

dt.Columns.Add(dc1); 
dt.Columns.Add(dc2); 
dt.Columns.Add(dc3); 

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

dt.Rows.Add(dtsmtp); 
dt.Rows.Add(dtimap); 

dt.Rows.Add("myusername", "mypassword", "[email protected]"); 

ds.Tables.Add(dt); 

Если я правильно, это будет достаточно, чтобы добавить таблицы «SMTP» и «IMAP» на мою основную таблицу «Почта». К сожалению, это не работает, я получаю только:

<Mail> 
    <Username>SMTP</Username> 
</Mail-Configuration> 
<Mail-Configuration> 
    <Username>IMAP</Username> 
</Mail> 
<Mail> 
    <Username>myusername</Username> 
    <Password>mypassword</Password> 
    <Mailaddress>[email protected]</Mailaddress> 
</Mail> 

Может кто-нибудь указать мне в правильном направлении, пожалуйста. Большое спасибо!

Редактировать: Извините! Во-первых, я должен был упомянуть, что я использую WriteXml(), чтобы получить его в формате XML. После того как я вставил отношение я получаю:

<Mail> 
    <Username>myusername</Username> 
    <Password>mypassword</Password> 
    <Mailaddress>[email protected]</Mailaddress> 
    <smtp_id>Mail_SMTP</smtp_id> 
    <imap_id>Mail_IMAP</imap_id> 
</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> 

Итак, мы близки, но не достаточно близко ...

Код:

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", "[email protected]", relation, relation1); 

ответ

0

попробуйте добавить все таблицы внутри набора данных и создать связь между таблицами с помощью уникальной столбец идентификаторов

//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", "[email protected]"); // 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"); 

Ref: Complete Solution

--SJ

+0

, как вы можете видеть в моем «Правке» выше: я не понимаю, как правильно добавить отношение к моей строке. Я попытался: dt.Rows.Add («myusername», «mypassword», «[email protected]», отношение, отношение1); Но WriteXml() производит: ... ... ... Так, SMTP и IMAP не вложен в MAIL, как и ожидалось –

+0

вам не нужно, чтобы добавить объект отношения в качестве столбцов таблицы; вместо этого добавьте объект отношения к набору данных. см. обновленный фрагмент кода, это поможет вам добавить новые строки в datatable.дайте мне знать, если вы все еще столкнулись с проблемой –

+0

Эй, дорогая, это здорово. наконец, мне удалось установить SMTP и IMAP в MAIL. К сожалению, writeXML() выводит «столбцы отношений». Я получаю: ... ... Как можно скрыть Соотношение колонны кораблей "? –

0

Если не XML поколение является необходимо сначала с помощью данных, тогда данные данных не должны быть структурированы так. Их следует добавить в набор данных и добавить отношения. Это обеспечивает правильную организацию.

Для генерации xml лучше использовать другие инструменты, такие как XDocument class.

0

Похоже, вы пытаетесь добавить dtsmtp и dtimap в виде строк на ваш dt datatable. Для того, чтобы получить структуру, я думаю, что вы после этого вам нужно добавить 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", "[email protected]", dtsmtp, dtimap); 

I Не уверен, что метод, который вы используете для преобразования этого в XML, но это сортировка структуры, которую вы хотите.

+0

Кстати, все это кажется немного противный , Есть почти определенно лучший способ добиться того, что вам нужно, не влагать данные. – Erresen

Смежные вопросы