首页 文章

C#Dataset动态添加DataColumn

提问于
浏览
1

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

EmployeeGroups
     /        \    
 Groups       Employees

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

Groups 包含员工可以参与的所有组,即超级用户,管理员,用户;我将命名唯一键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";
        }

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

如果我能提供进一步的探索或信息,请告诉我 .

谢谢你们

EDIT
更改数据库图表,错了

2 回答

  • 0

    当您使用itemarray时,您必须一次设置所有值 .
    所以:

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

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

    你应该做 :

    theRow["Groups"] = "1234"
    

    要么 :

    theRow[5] = "1234"
    
  • 0

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

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

    这带给我们这个 . 这是一个使用Employees,Groups和EmployeeGroups表创建和填充数据集的类 . 它创建关联表和其他两个表之间的关系,这些关系需要 DataColumn.ExpressionDataRow.GetChildRows 才能发挥其魔力 . 它还将表公开为WPF可以绑定的 IList 类型:

    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(); }            
            }
        }
    }
    

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

    <Window x:Class="JoinAndGroupDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:JoinAndGroupDemo"
        Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:DataSource x:Key="DataSource"/>
            <Style TargetType="Label">
                <Style.Setters>
                    <Setter Property="Background" Value="Navy"/>
                    <Setter Property="Foreground" Value="White"/>
                    <Setter Property="HorizontalAlignment" Value="Stretch"/>
                    <Setter Property="HorizontalContentAlignment" Value="Center"/>
                </Style.Setters>
            </Style>
       </Window.Resources>
        <DockPanel DataContext="{StaticResource DataSource}">
            <DockPanel DockPanel.Dock="Left">
                <Label DockPanel.Dock="Top">Employees</Label>
                <ListView ItemsSource="{Binding Employees}">
                    <ListView.View>
                        <GridView>
                            <GridView.Columns>
                                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=id}"/>
                                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=name}"/>
                                <GridViewColumn Header="Groups" DisplayMemberBinding="{Binding Path=groups}"/>
                            </GridView.Columns>
                        </GridView>
                    </ListView.View>
                </ListView>
            </DockPanel>
            <DockPanel DockPanel.Dock="Left">
                <Label DockPanel.Dock="Top">Groups</Label>
                <ListView ItemsSource="{Binding Groups}">
                    <ListView.View>
                        <GridView>
                            <GridView.Columns>
                                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=id}"/>
                                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=name}"/>
                                <GridViewColumn Header="Employees" DisplayMemberBinding="{Binding Path=employees}"/>
                            </GridView.Columns>
                        </GridView>
                    </ListView.View>
                </ListView>
            </DockPanel>
            <DockPanel>
                <Label DockPanel.Dock="Top">Employee groups</Label>
                <ListView ItemsSource="{Binding EmployeeGroups}">
                    <ListView.View>
                        <GridView>
                            <GridView.Columns>
                                <GridViewColumn Header="Employee" DisplayMemberBinding="{Binding Path=emp_name}"/>
                                <GridViewColumn Header="Group" DisplayMemberBinding="{Binding Path=grp_name}"/>
                            </GridView.Columns>
                        </GridView>
                    </ListView.View>
                </ListView>
            </DockPanel>
        </DockPanel>
    </Window>
    

相关问题