Проблема при вложении DataTable - PullRequest
0 голосов
/ 25 декабря 2009

Я пытаюсь добиться вложения в DataTable, то есть столбец DataTable является DataTable. Мой код примерно такой:

Таблица DataTable = new DataTable ();
Столбец DataColumn = new DataColumn («Квалификации», System.Type.GetType («System.Data.DataTable»));
table.Columns.Add (колонка);

Я получаю сообщение об ошибке во время выполнения в строке № 2, в котором говорится, что «Столбец требует допустимый тип данных». В чем может быть причина?

1 Ответ

2 голосов
/ 25 декабря 2009

Я бы сказал, что то, что вы пытаетесь достичь, невозможно, используя указанный вами способ. Для достижения взаимосвязи между сущностью и несколькими подобъектами используйте взаимосвязь «один ко многим» между одной таблицей и другой таблицей.

Это означает, что у вас есть две отдельные таблицы, назовите их, например, TableOne и TableMany . В 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
...