将datetime2插入数据库

时间:2015-12-20 14:10:08

标签: c# sql sql-server datetime2

我使用datetime2作为checkIncheckOut的数据类型。以前我可以使用此代码添加到数据库中。

//value for checkIn = 12/25/2015 2:00:00 PM
checkIn = DateTime.ParseExact(Session["checkInDate"].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture).AddHours(14);

//value for checkOut = 12/26/2015 12:00:00 PM
checkOut = DateTime.ParseExact(Session["checkOutDate"].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture).AddHours(12);

strInsert = "INSERT INTO Reservation ( checkInDate, checkOutDate) VALUES (@checkInDate, @checkOutDate)";

cmdInsert = new SqlCommand(strInsert, conn);
cmdInsert.Parameters.AddWithValue("@checkInDate", checkIn);
cmdInsert.Parameters.AddWithValue("@checkOutDate", checkOut);

但现在它没有用,我收到了这个错误;

  

"从字符转换日期和/或时间时转换失败   字符串"

我认为错误是由包含" PM"和#34; AM",但这很奇怪,因为之前我可以将它添加到数据库中。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您似乎要放弃checkInDate的时间部分。使用ParseExact来做到这一点并不是正确的方法。相反,您可以使用DateTime的.Date属性,然后添加小时。

另外,为了避免.AddWithValue可以给出的麻烦,只需使用.Add,所以......

string s = "12/25/2015 2:00:00 PM";
DateTime checkIn = DateTime.Parse(s, CultureInfo.GetCultureInfo("en-US")).Date.AddHours(14);
// ....
string strInsert = "INSERT INTO Reservation (checkInDate, checkOutDate) VALUES (@checkInDate, @checkOutDate)";

using (SqlConnection conn = new SqlConnection(connStr))
{
    using (SqlCommand cmdInsert = new SqlCommand(strInsert, conn))
    {
        cmdInsert.Parameters.Add(new SqlParameter("@checkInDate", SqlDbType.DateTime2).Value = checkIn);
        // ....
    }
}

请注意,您可以在会话值中存储DateTime,而无需将其存储为字符串。

我注意到您以美国日期格式(MM / dd / yyyy)引用签到日期,但.ParseExact中的格式为" dd / MM / yyyy"。这也可能是麻烦的来源。