让我解释一下。
图片你有流动的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);
}
这样我仍然可以执行相同的查询。
等待你的意见。我将非常感谢您提供的任何帮助。
答案 0 :(得分:1)
您可以使用带有可选参数的存储过程来实现此目的。如果参数为NULL,则使用NOW()代替。虽然我不是存储过程的忠实粉丝(它们是邪恶的!: - )。
您也可以使用IFNULL()。以下是在T-SQL中完成的操作(函数名称为ISNULL):
UPDATE test SET value = ISNULL(@value, GetDate() )