2009-12-15 8 views
1

Laissez-moi vous expliquer un peu.Comment passer une fonction de base de données MySQL comme un paramètre de requête de C#

image que vous avez l'écoulement table MySQL:

CREATE TABLE test (
    value DATETIME 
); 

Actuellement, je fais quelque chose comme ceci:

command.CommandText = "UPDATE test SET value = ?value"; 
command.Parameters.AddWithValue("?value", DateTime.Now); 

Mais les clients paramètres de date/heure ne sont pas fiables, donc je voudrais le temps de être déterminé sur le serveur. Quelque chose comme:

command.CommandText = "UPDATE test SET value = NOW()"; 

L'astuce est que je veux passer la fonction « NOW() » en tant que paramètre à la requête initiale. S'il vous plaît comprendre que ce petit exemple est simplifié. En réalité, la table a 48 colonnes, dont 7 datetime, marquant la date et/ou l'heure à laquelle l'utilisateur a effectué une opération particulière sur l'objet dénoté par la ligne de la base de données. Lorsque l'utilisateur effectue une nouvelle opération sur l'objet, je lis toute la ligne et l'insère à nouveau, avec un ID différent bien sûr (quelque chose comme l'historique des révisions d'un pauvre), donc j'aime conserver la date/heure de l'ancienne opération. insérez-le dans la nouvelle ligne, mais définissez en même temps la date/l'heure actuelle (telle que vue par la base de données) pour la nouvelle opération.

Pour plus de simplicité, revenons à l'exemple précédent. Dans la mesure où je peux trouver, j'ai deux choix.

bool switch; 
.... 
command.CommandText = "UPDATE test SET value = " + switch ? "NOW()" : "?value"; 
command.Parameters.AddWithValue("?value", value); 

OU

bool switch; 
.... 
if (switch) { 
    command.CommandText = "SELECT NOW()"; 
    value = Convert.ToDateTime(command.ExecuteScalar()); 
} 
command.CommandText = "UPDATE test SET value = ?value"; 
command.Parameters.AddWithValue("?value", value); 

Je n'aime pas plus propre d'entre eux. Ne serait-il pas génial si je pouvais faire quelque chose de similaire à:

command.CommandText = "UPDATE test SET value = ?value"; 
if (switch) { 
    command.Parameters.AddWithValue("?value", "NOW()"); 
} else { 
    command.Parameters.AddWithValue("?value", value); 
} 

De cette façon, j'exécuterais toujours la même requête.

En attente de vos opinions à ce sujet. Je serai très reconnaissant pour toute aide que vous pouvez fournir.

Répondre

1

Vous pouvez utiliser une procédure stockée avec un paramètre facultatif pour cela. Si le paramètre est NULL, vous utilisez NOW() à la place. Bien que je ne suis pas un grand fan de procs stockés (ils sont méchants! :-).

Vous pouvez également utiliser IFNULL(). Voici comment cela se fait en T-SQL (le nom de la fonction est ISNULL):

UPDATE test SET value = ISNULL(@value, GetDate()) 
+0

J'ai déjà une procédure pour cette fonctionnalité. Ce n'est pas réellement stocké, ça s'appelle une fonction et c'est écrit en C# :-). Je suis totalement d'accord avec vous, ils sont méchants! Plus un proc stocké signifie encore une autre chose à changer quand je "redécorer" la table. –

Questions connexes