我尝试在查询完成后向数据集添加一个额外的列,并使用数据填充该新列。我有以下数据库关系:
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";
}
目前,代码将创建新列,但是当我将数据分配给该列时,将不会分配任何内容,我缺少什么?
如果我可以提供任何进一步的探索或信息,请告诉我。
谢谢大家
修改
更改数据库图表,错误
答案 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表创建和填充数据集的类。它创建了关联表与EmployeeGroups
和DataColumn.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(); }
}
}
}