将日期/时间对象传递给SQL时转换失败

时间:2013-04-01 02:31:34

标签: c# sql-server

我正在尝试向表中添加新信息,但是当将日期/时间从字符转换为字符串时,它会给我转换失败错误。

以下是我的代码的一部分:

try
{
    string sp = "add"; 

    comando.CommandType = CommandType.StoredProcedure;
    comando.CommandText = sp;
    comando.Parameters.Clear();

    comando.Parameters.Add(new SqlParameter("@person", SqlDbType.VarChar));
    comando.Parameters.Add(new SqlParameter("@reason", SqlDbType.VarChar));

    comando.Parameters.Add(new SqlParameter("@information", SqlDbType.VarChar));
    comando.Parameters.Add(new SqlParameter("@date", SqlDbType.DateTime));
    comando.Parameters[0].Value = obj.person;
    comando.Parameters[1].Value = obj.reason;
    comando.Parameters[2].Value = obj.information;
    comando.Parameters[3].Value = obj.date;
    comando.ExecuteNonQuery();
}
catch (Exception exc)
{
    throw exc;
}

要获取我使用obj.date = DateTime.Now;的日期信息,这是正确的吗?

2 个答案:

答案 0 :(得分:0)

或者,您可以使用AddWithValue()

comando.CommandType = CommandType.StoredProcedure;
comando.CommandText = sp;

comando.Parameters.AddWithValue("@person", obj.person);
comando.Parameters.AddWithValue("@reason", obj.reason);
comando.Parameters.AddWithValue("@information", obj.information);
comando.Parameters.AddWithValue("@date", DateTime.Now);

// assuming connection is already open

comando.ExecuteNonQuery();

答案 1 :(得分:0)

我不记得有时或为什么有时将简单的日期/时间对象发送到SQL中将无法正常工作。

解决方案是将日期/时间对象转换为通用ISO 8601 formatyyyyMMdd HH:mm:ss.fff - SQL绝对喜欢。

这是一个从J W's answer开始的片段,它实际上是最佳实践:

const String UniversalDateTime = "yyyyMMdd HH:mm:ss.fff";

comando.CommandType = CommandType.StoredProcedure;
comando.CommandText = sp;

comando.Parameters.AddWithValue("@person", obj.person);
comando.Parameters.AddWithValue("@reason", obj.reason);
comando.Parameters.AddWithValue("@information", obj.information);
comando.Parameters.AddWithValue("@date", obj.date.ToString(UniversalDateTime));

// assuming connection is already open

comando.ExecuteNonQuery();

当SQL收到日期/时间字符串表示时,该值将自动转换为SQL的内部日期/时间值。


PS。我还记得使用T作为分隔符来尝试ISO 8601格式:yyyyMMddTHH:mm:ss.fff。尝试使用带有空格的版本,这对我来说在使用en-US SQL语言环境和非en-US语言环境时也适用。