这可能听起来很容易,但我已经尝试了几次,但无法得到我想要的。
我有一个存储过程,它有一个类型的DATETIME
输入。我已经通过提供硬编码的字符串来确保存储过程正常工作N'2012-12-31 16:45:00'
。
现在我想使用来自 C# 的相同输入值执行相同的存储过程。我应该如何指定 的值Datetime
?
限制更新:不允许参数化 SQL
这可能听起来很容易,但我已经尝试了几次,但无法得到我想要的。
我有一个存储过程,它有一个类型的DATETIME
输入。我已经通过提供硬编码的字符串来确保存储过程正常工作N'2012-12-31 16:45:00'
。
现在我想使用来自 C# 的相同输入值执行相同的存储过程。我应该如何指定 的值Datetime
?
限制更新:不允许参数化 SQL
(在添加对参数化 SQL 的限制之前编写的答案。)
我应该如何指定日期时间的值?
使用参数化 SQL,就像其他值一样。
using (SqlCommand command = new SqlCommand("StoredProcName", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@Foo", SqlDbType.DateTime).Value =
new DateTime(2012, 12, 31, 16, 45, 0);
// Execute here
}
不要乱找合适的字符串形式。尽可能避免字符串转换。虽然我不太反对在直接的 SQL 语句中包含硬编码的字符串和数值,因为它们很明显,但我肯定会为任何日期/时间值使用参数,以避免哪怕是一点转换问题。(而且我也会对可能需要转义的任何字符串使用参数......)
只需将日期时间作为参数提供给存储过程。
using (SqlConnection conn = new SqlConnection("ConnString"))
{
conn.Open();
SqlCommand cmd = new SqlCommand("Exec SP_Test @theDate",conn);
cmd.Parameters.AddWithValue("theDate",new DateTime(2012,12,31,16,45,0));
cmd.ExecuteNonQuery();
}
您还可以在测试时将硬编码值添加为存储过程中的默认参数。