如何将来自c#的MySQL数据库函数作为查询参数传递

时间:2009-12-15 22:34:19

标签: c# .net mysql ado.net parameters

让我解释一下。

图片你有流动的MySQL表:

CREATE TABLE test (
  value DATETIME
);

目前我正在做这样的事情:

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

但客户日期/时间设置不可靠,所以我希望在服务器上确定时间。类似的东西:

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

技巧是我想将“NOW()”函数作为参数传递给原始查询。请理解这个小例子已经完全简化了。实际上,该表有48列,其中7列是日期时间,标记用户对数据库行所表示的对象进行特定操作的日期和/或时间。当用户对对象执行新操作时,我读取整行并再次插入,当然使用不同的ID(有点像穷人的修订历史),所以我想保留旧操作的日期/时间,将其插入新行,但同时为新操作设置当前日期/时间(如数据库所示)。

为简单起见,我们回到上一个例子。

据我所知,我有两个选择。

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

OR

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

我不喜欢他们更整洁。如果我能做类似的事情,那不是很整洁:

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

这样我仍然可以执行相同的查询。

等待你的意见。我将非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用带有可选参数的存储过程来实现此目的。如果参数为NULL,则使用NOW()代替。虽然我不是存储过程的忠实粉丝(它们是邪恶的!: - )。

您也可以使用IFNULL()。以下是在T-SQL中完成的操作(函数名称为ISNULL):

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