C#数据集动态添加DataColumn

时间:2010-05-14 23:56:57

标签: c# wpf sql-server-2008 dataset

我尝试在查询完成后向数据集添加一个额外的列,并使用数据填充该新列。我有以下数据库关系:

    EmployeeGroups
     /        \    
 Groups       Employees

Empoyees 保存该个人的所有数据,我将该唯一键命名为UserID。

群组包含员工可以参与的所有群组,即超级用户,管理员,用户;我将命名唯一键GroupID

EmployeeGroups 包含每个员工所属的组的所有关联。 (UserID | GroupID)

我想要完成的是在查询所有用户后,我想循环每个用户,并通过向名为“Groups”的数据集添加新列并添加要插入的typeof字符串来添加用户所属的组用户所属的组。然后,通过使用数据绑定,将列表视图与所有员工及其组关联填充

我的代码如下;位置5是我尝试添加到数据集的新列。

string theQuery = "select UserID, FirstName, LastName, EmployeeID, Active from Employees";
DataSet theEmployeeSet = itsDatabase.runQuery(theQuery);
        DataColumn theCol = new DataColumn("Groups", typeof(string));
        theEmployeeSet.Tables[0].Columns.Add(theCol);
        foreach (DataRow theRow in theEmployeeSet.Tables[0].Rows)
        {
            theRow.ItemArray[5] = "1234";
        }

目前,代码将创建新列,但是当我将数据分配给该列时,将不会分配任何内容,我缺少什么?

如果我可以提供任何进一步的探索或信息,请告诉我。

谢谢大家

修改
更改数据库图表,错误

2 个答案:

答案 0 :(得分:0)

使用itemarray时,必须立即设置所有值 所以:

theRow.ItemArray = new object[] { x,y,z,s,d };

我同意你不应该这样使用它。
我想getter会复制数据并填充该副本的元素5

你应该这样做:

theRow["Groups"] = "1234"

或者:

theRow[5] = "1234"

答案 1 :(得分:0)

假设您的员工/组和关联之间存在关系完整性,您可以将表放在DataSet中,添加DataRelation以定义表之间的关系,然后创建{{1在关联表中使用DataColumn来查找相关表中的值。这将为您提供一个DataColumn.Expression表,可以显示每个员工和组名。

可悲的是,如果你想转向其他方式,即在Employees表中创建一个列,将所有组聚合在一起(这就是你所描述的),你就不能用表达式来实现。在这种情况下,最简单的方法是执行您描述的操作,并向Employees表中添加一列。但LINQ使得填充该列非常简单,如果您已经创建了表之间的关系,并且EmployeeGroups表中的列获得了员工和组名,那就更好了。

这将我们带到了这一点。这是一个使用Employees,Groups和EmployeeGroups表创建和填充数据集的类。它创建了关联表与EmployeeGroupsDataColumn.Expression所需的其他两个表之间的关系,以便发挥其魔力。它还将表公开为WPF可以绑定的DataRow.GetChildRows类型:

IList

这是一个显示所有这些信息的窗口的XAML:

using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;

namespace JoinAndGroupDemo
{
    public class DataSource
    {
        private DataSet _DS;

        public DataSource()
        {
            CreateDataSet();
        }

        private void CreateDataSet()
        {
            _DS = new DataSet();
            DataTable emp = _DS.Tables.Add("Employees");
            DataTable grp = _DS.Tables.Add("Groups");
            InitTable(emp);
            InitTable(grp);

            DataTable assoc = _DS.Tables.Add("EmployeeGroups");
            assoc.Columns.Add("empId", typeof (int));
            assoc.Columns.Add("grpId", typeof (int));

            _DS.Relations.Add(new DataRelation("FK_EmployeeGroups_Employees", 
                emp.Columns["id"], assoc.Columns["empId"]));
            _DS.Relations.Add(new DataRelation("FK_EmployeeGroups_Groups", 
                grp.Columns["id"], assoc.Columns["grpId"]));

            assoc.Columns.Add("emp_name");
            assoc.Columns["emp_name"].Expression = "Parent(FK_EmployeeGroups_Employees).name";
            assoc.Columns.Add("grp_name");
            assoc.Columns["grp_name"].Expression = "Parent(FK_EmployeeGroups_Groups).name";

            emp.Rows.Add(new object[] { 1, "Malcolm Reynolds"});
            emp.Rows.Add(new object[] { 2, "Zoe Washburne" });
            emp.Rows.Add(new object[] { 3, "Hoban Washburne" });
            emp.Rows.Add(new object[] { 4, "Irina Serra" });
            emp.Rows.Add(new object[] { 5, "Jayne Cobb" });
            emp.Rows.Add(new object[] { 6, "Kaylee Frye" });
            emp.Rows.Add(new object[] { 7, "Simon Tam" });
            emp.Rows.Add(new object[] { 8, "River Tam" });
            emp.Rows.Add(new object[] { 9, "Derrial Book" });

            grp.Rows.Add(new object[] { 1, "Command"});
            grp.Rows.Add(new object[] { 2, "Combat" });
            grp.Rows.Add(new object[] { 3, "Operations" });
            grp.Rows.Add(new object[] { 4, "Other" });

            assoc.Rows.Add(new object[] { 1, 1 });
            assoc.Rows.Add(new object[] { 2, 1 });
            assoc.Rows.Add(new object[] { 1, 2 });
            assoc.Rows.Add(new object[] { 2, 2 });
            assoc.Rows.Add(new object[] { 5, 2 });
            assoc.Rows.Add(new object[] { 8, 2 }); // spoiler alert!
            assoc.Rows.Add(new object[] { 3, 3 });
            assoc.Rows.Add(new object[] { 6, 3 });
            assoc.Rows.Add(new object[] { 4, 4 });
            assoc.Rows.Add(new object[] { 7, 4 });
            assoc.Rows.Add(new object[] { 8, 4 });
            assoc.Rows.Add(new object[] { 9, 4 });

            emp.Columns.Add("groups", typeof (string));
            foreach (DataRow empRow in emp.Rows)
            {
                empRow["groups"] = string.Join(
                    ", ",
                    empRow
                        .GetChildRows("FK_EmployeeGroups_Employees")
                        .AsEnumerable()
                        .Select(x => (string) x["grp_name"])
                        .ToArray());
            }

            grp.Columns.Add("employees", typeof(string));
            foreach (DataRow grpRow in grp.Rows)
            {
                grpRow["employees"] = string.Join(
                    ", ",
                    grpRow
                        .GetChildRows("FK_EmployeeGroups_Groups")
                        .AsEnumerable()
                        .Select(x => (string)x["emp_name"])
                        .ToArray());
            }
        }

        private void InitTable(DataTable t)
        {
            t.Columns.Add("id", typeof (int));
            t.Columns.Add("name", typeof (string));

            // this is required by DataRelations
            t.PrimaryKey = new DataColumn[] { t.Columns["id"]};
        }

        public IList Employees
        {
            get
            { return ((IListSource)_DS.Tables["Employees"]).GetList(); }
        }

        public IList Groups
        {
            get { return ((IListSource)_DS.Tables["Groups"]).GetList(); }
        }

        public IList EmployeeGroups
        {
            get { return ((IListSource)_DS.Tables["EmployeeGroups"]).GetList(); }            
        }
    }
}