【问题标题】:Problem while nesting DataTable嵌套数据表时出现问题
【发布时间】:2009-12-25 07:44:12
【问题描述】:

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

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

我在第 2 行收到一条运行时错误消息,上面写着“列需要有效的数据类型”。可能是什么原因?

【问题讨论】:

    标签: asp.net datatable runtime nested


    【解决方案1】:

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

    这意味着您有两个单独的表,例如 TableOneTableMany。在 TableOne 中放置描述您的实体的所有字段,并确保有一个主键。在 TableMany 中放置所有描述您的子实体的字段,并包括一个属于 TableOne 主键字段类型的字段,该字段将每个子实体与其拥有的实体。

    例如:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多