我使用datetime2
作为checkIn
和checkOut
的数据类型。以前我可以使用此代码添加到数据库中。
//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",但这很奇怪,因为之前我可以将它添加到数据库中。
有人知道如何解决这个问题吗?
答案 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"。这也可能是麻烦的来源。