2011-07-28 3 views
0

Je fais un projet de fréquentation d'université (Winforms, Mysql, C#)Comment simplifier la requête de mise à jour dans mysql?

Je veux mettre à jour 0 à P, 1 à Ab et 2 à OD dans toutes les colonnes de période. Pour cela, j'écris une boucle for et trois requête de mise à jour.

Est-ce une idée possible de le faire en une seule requête?

S'il vous plaît aidez-moi ...

for (int i = 1; i <= 8; i++) 
      { 
       string period = "Period" + i; 
       string t1p = period1; 

       command.CommandText = "update attendance_daily_rpt set " + t1p + " = 'P' where " + t1p + " = 0"; 
       connection.Open(); 
       command.ExecuteNonQuery();     
       connection.Close(); 

       command.CommandText = "update attendance_daily_rpt set " + t1p + " = 'Ab' where " + t1p + " = 1"; 
       connection.Open(); 
       command.ExecuteNonQuery(); 
       connection.Close(); 

       command.CommandText = "update attendance_daily_rpt set " + t1p + " = 'OD' where " + t1p + " = 2"; 
       connection.Open(); 
       command.ExecuteNonQuery(); 
       connection.Close(); 
      } 

Merci à l'avance ...

Répondre

2

SQL:

SET t1p = 
CASE t1p 
WHEN '1' THEN 'AB' 
WHEN '2' THEN 'OD' 
END 

Marque C# string vous;)

+0

mettre à jour avec votre idée, .. Command.CommandText = "update attendance_daily_rpt set" + T1P + "= '0 cas où' puis 'P' quand '1' puis ' AB 'QUAND' 2 'PUIS' FIN '; connection.Open(); command.ExecuteNonQuery(); connection.Fermer(); Mais toutes les colonnes de 0,1,2 sont mises à jour 'AB' seulement. Quelle erreur j'ai faite dans cette requête. – Sagotharan

+0

essayer de changer CASE à CASE t1p – sll

+0

Je ne peux pas obtenir sll. Je ne connais pas ce concept de CAS dans mysql. Mieux, je lis la syntaxe. Merci. Si j'ai eu je commente ici. – Sagotharan

1

Vous pouvez utiliser un CASE déclaration

UPDATE 
    attendance_daily_rpt 
SET 
    PeriodX = CASE PeriodX 
       WHEN '0' THEN 'P' 
       WHEN '1' THEN 'Ab' 
       WHEN '2' THEN 'OD' 
       ELSE PeriodX 
      END 
+1

Qu'en est-il de la conversion de type? Vous êtes cas PériodeX comme numérique mais assignez des chaînes – sll

+0

Oups, oui. Fixé. – FlyingStreudel

+0

chose étonnante sll. merci pour les deux – Sagotharan

2

Peut-être mais il serait très probablement une monstruosité qui peut très bien fonctionner pire que vingt-quatre mises à jour mises à jour. Je ne vois rien de particulièrement mauvais avec votre solution actuelle autre que le fait que:

  • vous pouvez le faire comme une transaction; et
  • il peut ne pas être nécessaire de fermer et d'ouvrir la connexion pour chaque instruction SQL unique.

Je vais essayer de commencer par quelque chose comme:

connection.Open(); 
// Start transaction with whatever it takes. 
for (int i = 1; i <= 8; i++) { 
    string t1p = "Period" + i;; 
    command.CommandText = "update attendance_daily_rpt set " + t1p 
     + " = 'P' where " + t1p + " = '0'"; 
    command.ExecuteNonQuery();     
    command.CommandText = "update attendance_daily_rpt set " + t1p 
     + " = 'Ab' where " + t1p + " = '1'"; 
    command.ExecuteNonQuery(); 
    command.CommandText = "update attendance_daily_rpt set " + t1p 
     + " = 'OD' where " + t1p + " = '2'"; 
    command.ExecuteNonQuery(); 
} 
// Commit transaction. 
connection.Close(); 

Vous pouvez aussi simplement les déclarations individuelles vers le bas à un tableau recherche avec quelque chose comme:

string[] vals = new string[] {"P", "Ab", "OD"}; 
connection.Open(); 
// Start transaction with whatever it takes. 
for (int i = 1; i <= 8; i++) { 
    string t1p = "Period" + i;; 
    for (int j = 0; j < vals.Length; j++) { 
     command.CommandText = "update attendance_daily_rpt set " + t1p 
      + " = '" + vals[j] +"' where " + t1p + " = '" + j + "'"; 
     command.ExecuteNonQuery();     
    } 
} 
// Commit transaction. 
connection.Close(); 
+0

donc cette méthode réduit la connexion ouverte et ferme. Est-ce? – Sagotharan

3

Créer une table pour maintenant le mappage (attendance_daily_rpt_map):

 
+-----------+---------+ 
| FromValue | ToValue | 
+-----------+---------+ 
| 0   | P  | 
| 1   | Ab  | 
| 2   | OD  | 
+-----------+---------+ 

Et puis changez votre requête:

UPDATE 
    attendance_daily_rpt 
    INNER JOIN attendance_daily_rpt_map ON attendance_daily_rpt.t1p = attendance_daily_rpt_map.FromValue 
SET 
    attendance_daily_rpt.t1p = attendance_daily_rpt_map.ToValue 
+0

c'est une nouvelle idée. Merci. – Sagotharan

+1

t1p est calculé en temps réel – sll

+1

Le nom de la colonne? Ensuite, remplacez simplement 't1p' par le nom de la colonne dans la concaténation de chaîne. –