2010-05-14 106 views
1

我想在查詢完成後向數據集添加額外的列,並用數據填充新列。我有以下的數據庫關係:C#數據集動態添加DataColumn

EmployeeGroups 
    /  \  
Groups  Employees 

Empoyees持有該個人所有的數據,我將其命名爲唯一鍵的用戶名。

團體擁有僱員可以成爲其中一員的所有團體,即超級用戶,管理員,用戶;等等。我將命名唯一密鑰GroupID

EmployeeGroups擁有每個員工所屬的組的所有關聯。 (UserID | GroupID)

我想要完成的是在查詢所有用戶後,我想循環訪問每個用戶,並通過向名爲'Groups'的數據集添加新列來添加用戶所屬的組。用一個字符串來插入用戶所屬的組。然後通過使用數據綁定填充所有員工及其組織關聯的列表視圖

我的代碼如下;位置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

你有問題嗎? – 2010-05-14 23:59:17

+0

當我正在格式化問題的過程中,我意外地錯過了添加問題部分。對於那個很抱歉 – Wesley 2010-05-15 00:02:28

回答

0

當您使用itemarray您必須一次設置所有值。
這樣:

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

我同意這是不明確的,你應該使用這種方式..
我想getter創建數據的副本,並填寫該副本的元素5

你應該這樣做:

theRow["Groups"] = "1234" 

或者:

theRow[5] = "1234" 
0

假設有你的員工/團體和協會之間的關係完整性,您可以把表中的一個DataSet,加DataRelation s到定義表之間的關係,然後創建DataColumn S IN的關聯表使用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>