嵌套数据表时出现问题 [英] Problem while nesting DataTable

查看:75
本文介绍了嵌套数据表时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在DataTable中实现嵌套,即DataTable的一列是DataTable.我的代码是这样的:

I am trying to achieve nesting in DataTable, i.e. a column of DataTable is a DataTable. My code is something like this:

DataTable表=新的DataTable();
DataColumn列=新的DataColumn("Qualifications",System.Type.GetType("System.Data.DataTable"));
table.Columns.Add(column);

DataTable table = new DataTable();
DataColumn column = new DataColumn("Qualifications", System.Type.GetType("System.Data.DataTable"));
table.Columns.Add(column);

我在第2行收到一条运行时错误消息,提示列需要有效的数据类型".可能是什么原因?

I am getting a runtime error message at line # 2, that says "Column requires a valid DataType". What could be the reason?

推荐答案

我要说的是,使用您指定的方式无法实现您想要的目标.要在一个实体和几个子实体之间建立关系,请在一个表和另一个表之间使用一对多关系.

I would say that what you are attempting to achieve is not possible using the way you specified. To achieve a relationship between an entity and several sub-entities use a one-to-many relationship between one table and another table.

这意味着您有两个单独的表,分别称为实例 TableOne TableMany .在 TableOne 中,放入描述您的实体的所有字段,并确保具有主键.在 TableMany 中,放入描述您的子实体的所有字段,并包括一个 TableOne 主键字段类型的字段,该字段将每个子实体与它拥有的实体.

This means you have two separate tables, call them for instance TableOne and TableMany. In TableOne put all the fields that describe your entity, and make sure to have a primary key. In TableMany put all the fields that describe your sub-entities, and include a field which is of the type of the TableOne primary key field, which relates each sub-entity to its owning entity.

例如:

TableOne:
    int          PrimaryKey
    nvarchar(50) Name

TableMany:
    int          ForeignKey
    nvarchar(50) Qualification
    int          Grade

TableOne sample content:
    PrimaryKey     Name
    1              Alice
    2              Bob
    3              Charlie

TableMany sample content:
    ForeignKey     Qualification    Grade
    1              Driving          100
    1              Acting           60
    1              Singing          30
    2              Driving          40
    2              Piloting         90
    2              Snowboarding     80
    3              Dancing          70
    3              Tennis           30

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace datatests
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Main();
        }

        DataSet dataSet;
        DataTable TableOne, TableMany;
        DataRelation OneToManyRelation;

        void Main()
        {
            dataSet = new DataSet();

            TableOne = new DataTable();
            var TableOnePK = TableOne.Columns.Add("PrimaryKey", typeof(int));
            TableOne.Columns.Add("Name", typeof(string));

            TableMany = new DataTable();
            var TableManyFK = TableMany.Columns.Add("ForeignKey", typeof(int));
            TableMany.Columns.Add("Qualification", typeof(string));
            TableMany.Columns.Add("Grade", typeof(int));

            dataSet.Tables.Add(TableOne);
            dataSet.Tables.Add(TableMany);

            TableOne.Constraints.Add("PK", TableOnePK, true);
            OneToManyRelation = new DataRelation("OneToMany", TableOnePK, TableManyFK);

            TableOne.ChildRelations.Add(OneToManyRelation);

            // Populate TableOne with sample data.
            AddTableOneRow(1, "Alice");
            AddTableOneRow(2, "Bob");
            AddTableOneRow(3, "Charlie");

            // Populate TableMany with sample data.
            AddTableManyRow(1, "Driving", 100);
            AddTableManyRow(1, "Acting", 60);
            AddTableManyRow(1, "Singing", 30);
            AddTableManyRow(2, "Driving", 40);
            AddTableManyRow(2, "Piloting", 90);
            AddTableManyRow(2, "Snowboarding", 80);
            AddTableManyRow(3, "Dancing", 70);
            AddTableManyRow(3, "Tennis", 30);

            var parentRow=TableOne.Rows[0];
            var childRows = parentRow.GetChildRows(OneToManyRelation);
            Console.WriteLine("Data for record key #{0}, Name={1}", 
                parentRow["PrimaryKey"], 
                parentRow["Name"]);
            Console.WriteLine("Qualifications:");
            foreach (DataRow childRow in childRows)
            {
                Console.WriteLine("    {0}: {1}", 
                    childRow["Qualification"], 
                    childRow["Grade"]);
            }
        }

        private void AddTableManyRow(int fk, string qual, int grade)
        {
            var newRow = TableMany.NewRow();
            newRow["ForeignKey"] = fk;
            newRow["Qualification"] = qual;
            newRow["Grade"] = grade;
            TableMany.Rows.Add(newRow);
        }

        private void AddTableOneRow(int key, string name)
        {
            var newRow = TableOne.NewRow();
            newRow["PrimaryKey"] = key;
            newRow["Name"] = name;
            TableOne.Rows.Add(newRow);
        }
    }
}

示例输出:

Data for record key #1, Name=Alice
Qualifications:
    Driving: 100
    Acting: 60
    Singing: 30

这篇关于嵌套数据表时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆