2011-06-23 4 views
0

J'ai une information de stockage datable sur une classe d'étudiant. Ma table ressemble à ceci:Mise à jour d'un datatable en C#

Student ID  Grade  Absence Count 
00001   85    0 
00002   95    7 
00002   70    5 
00003   35    1 

Ne me demandez pas pourquoi il y a deux id qui sont les mêmes ... sa juste la façon dont il est. Maintenant, je veux mettre à jour le nombre d'absences pour l'ID 00002 qui a le nombre d'absence de 7. Dans le même temps, je veux supprimer l'entrée 00002 qui n'a pas le nombre d'absences de 7 (dans ce cas, celui avec le compte 5). Maintenant, je sais comment interroger la table avec une instruction select et mettre à jour l'étudiant id 00002 avec le compte 7. Comment puis-je, en même temps, supprimer l'autre entrée pour l'étudiant 00002? Ceci est mon code:

foreach(oldCount in absenceCount) 
{ 
    DataRow[] dr = dt.Select("Student ID='" + ID + "' AND Absence Count='" + oldCount); 
    dr[0]["Absence Count"] = newCount; 
} 

Voici donc comment puis-je dire au programme que s'il y a un autre numéro d'étudiant dont le nombre absence isnt dans la liste absenceCount, supprimer de la table?

Merci

+0

Probablement un doublon: http://stackoverflow.com/questions/1591771/datatable-how-to-conditionally-delete-rows – Joulukuusi

+0

Vous aurez besoin de mieux définir les règles entourant la raison pour laquelle vous voulez supprimer le 2ème et mettre à jour le 1er. Est-ce positionnel? Parce que 7> 5? parce que 95> 70? entrée de l'utilisateur? –

Répondre

0

Vous pouvez faire la même chose select mais avec la condition opposée sur le oldcount, comme si

foreach(oldCount in absenceCount) 
{ 
    DataRow[] dr = dt.Select("Student ID='" + ID + "' AND Absence Count != '" + oldCount); 
    dr[0].Delete(); 
} 

Ceci vous donnera l'identifiant de l'étudiant mais où le nombre d'absences n'est pas égal à l'ancien nombre.

Vous avez évidemment toujours un problème où vous avez, comme le suggère Blindy, 2 lignes avec le même identifiant d'étudiant et le même nombre d'absences.

+0

oups juste essayé, apparemment! n'est pas une syntaxe de requête acceptée – Greg

+0

try <> plutôt que! = – hermiod

+0

La ligne répétée du même étudiant (avec le même identifiant) apparaît-elle deux fois ou est-ce que deux étudiants différents avec le même identifiant apparaissent chacun une fois. – hermiod

1

Vous pouvez écrire

dr[1].Delete(); 

+0

Non, je ne peux pas car le select obtient seulement les lignes qui ont le nombre d'absences que je veux supprimer. En d'autres termes, la ligne d'identifiant 00002 avec le compte 5 ne sera pas dans la barre de données du dr – Greg

+0

@Greg: Vous pouvez exécuter un autre 'Select()' avec une condition différente. – SLaks

+0

comme quoi? Comment puis-je exécuter une sélection pour sélectionner une ligne qui ne correspond pas au contenu de la liste oldCOunt? – Greg

0

Je suppose que vous pouvez sélectionner toutes les lignes avec la même ID. Mettez à jour celui que vous voulez et supprimez le reste des lignes. Quelque chose comme

DataRow[] dr = dt.Select("Student ID='" + ID + "'"); 

puis de mettre à jour celui qui correspond au nombre d'absences, en supprimant le reste d'entre eux.

En ce qui concerne le commentaire: Il est extrait de la réponse de Kenny, mais ce que je voulais dire

foreach(DataRow row in dr) 
{ 
    if (dr["Absence Count"] == absencCount) 
     dr["Absence Count"] = newCount; 
    else 
     dr.Delete() 
} 
+0

Mais comment obtenez-vous "le reste d'entre eux"? – Greg

0
foreach(oldCount in absenceCount) 
{ 
    DataRow[] dr = dt.Select("Student ID='" + ID); 
    bool updated = false; 
    foreach(DataRow row in dr) 
    { 
     if (!updated && dr["Absence Count"] == absenceCount) 
     { 
      dr["Absence Count"] = newCount; 
      updated = true; 
     } 
     else 
     { 
      dr.Delete() 
     } 
    } 
} 
Questions connexes