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