2010-05-14 3 views
1

J'essaie d'ajouter une colonne supplémentaire à un jeu de données après la fin d'une requête et de remplir cette nouvelle colonne avec des données. J'ai une relation de base de données des éléments suivants:Dataset C# Ajouter dynamiquement DataColumn

EmployeeGroups 
    /  \  
Groups  Employees 

empoyees détient toutes les données pour cette personne, je vais nommer la clé unique du code d'utilisateur.

Les groupes contiennent tous les groupes dont un employé peut faire partie, à savoir Super User, Admin, User; etc. Je vais nommer la clé unique GroupID

EmployeeGroups contient toutes les associations dont les groupes appartiennent à chaque employé. (UserID | GroupID)

Ce que j'essaye d'accomplir est après l'interrogation de tous les utilisateurs que je veux boucler si chaque utilisateur et ajoute quels groupes cet utilisateur est en partie en ajoutant une nouvelle colonne au jeu de données appelé «groupes» avec une chaîne typeof pour insérer les groupes dont l'utilisateur fait partie. Ensuite, à l'aide de la liaison de données, remplissez une liste avec tous les employés et leurs associations de groupes

Mon code est le suivant; La position 5 est la nouvelle colonne que j'essaie d'ajouter à l'ensemble de données.

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"; 
     } 

Actuellement, le code va créer la nouvelle colonne, mais quand je insérer les données que rien de colonne sera affecté, qu'est-ce que je manque?

S'il y a d'autres explications ou informations que je peux fournir, s'il vous plaît faites le moi savoir.

Merci à tous

EDIT
schéma de base de données Changed, a eu tort

+0

Avez-vous une question? –

+0

J'ai accidentellement manqué d'ajouter la partie de la question lorsque j'étais en train de formater la question. Désolé pour ça – Wesley

Répondre

0

lorsque vous utilisez ItemArray vous devez définir toutes les valeurs à la fois.
donc:

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

Je suis d'accord, il ne sait pas que vous devez l'utiliser de cette façon ..
Je suppose que le getter fait une copie des données et vous élément de remplissage 5 de cette copie

Vous devriez faire:

theRow["Groups"] = "1234" 

Ou:

theRow[5] = "1234" 
0

En supposant qu'il y ait intégrité relationnelle entre vos employés/groupes et associations, vous pouvez mettre les tables dans un DataSet, ajouter DataRelation s pour définir les relations entre les tables, puis créez DataColumn s dans la table d'association qui utilisent DataColumn.Expression à rechercher des valeurs à partir des tables connexes. Cela vous donnera une table EmployeeGroups qui peut afficher chaque nom d'employé et de groupe. Tragiquement, si vous voulez aller dans l'autre sens, c'est-à-dire,créer une colonne dans la table Employés qui agrège tous ses groupes (ce que vous décrivez), vous ne pouvez pas le faire avec une expression. Dans ce cas, il est probablement plus facile de faire ce que vous décrivez et d'ajouter une colonne à la table Employés. Mais LINQ simplifie le remplissage de cette colonne, et si vous avez déjà créé les relations entre les tables et les colonnes de la table EmployeeGroups qui obtiennent les noms des employés et des groupes, tant mieux.

Ce qui nous amène à cela. Voici une classe qui crée et remplit un ensemble de données avec les tables Employees, Groups et EmployeeGroups. Il crée des relations entre la table d'association et les deux autres tables, dont DataColumn.Expression et DataRow.GetChildRows ont besoin pour faire leur magie. Il expose aussi les tableaux que IList types qui WPF peuvent se lier à:

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

Et voici le XAML pour une fenêtre qui affiche toutes ces informations:

<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>