C# 通过WCF将JSON日期时间转换为SQL Server数据库
在过去的几天里,我注意到一个问题,我提交到sql server数据库的日期是错误的。我有一个网页,用户可以在那里预订设施。此网页采用名称、日期、开始时间和结束时间(BookingID是事务所必需的,但由数据库生成),我将其格式化为JSON字符串,如下所示:C# 通过WCF将JSON日期时间转换为SQL Server数据库,c#,sql,json,wcf,C#,Sql,Json,Wcf,在过去的几天里,我注意到一个问题,我提交到sql server数据库的日期是错误的。我有一个网页,用户可以在那里预订设施。此网页采用名称、日期、开始时间和结束时间(BookingID是事务所必需的,但由数据库生成),我将其格式化为JSON字符串,如下所示: {"BookingEnd":"\/Date(2012-26-03 09:00:00.000)\/","BookingID":1,"BookingName":"client test 1","BookingStart":"\/Date(2012
{"BookingEnd":"\/Date(2012-26-03 09:00:00.000)\/","BookingID":1,"BookingName":"client test 1","BookingStart":"\/Date(2012-26-03 10:00:00.000)\/","RoomID":4}
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "createbooking")]
void CreateBooking(Booking booking);
[DataContract]
public class Booking
{
[DataMember]
public int BookingID { get; set; }
[DataMember]
public string BookingName { get; set; }
[DataMember]
public DateTime BookingStart { get; set; }
[DataMember]
public DateTime BookingEnd { get; set; }
[DataMember]
public int RoomID { get; set; }
}
然后将其传递给WCF服务,该服务按如下方式处理数据库插入:
{"BookingEnd":"\/Date(2012-26-03 09:00:00.000)\/","BookingID":1,"BookingName":"client test 1","BookingStart":"\/Date(2012-26-03 10:00:00.000)\/","RoomID":4}
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "createbooking")]
void CreateBooking(Booking booking);
[DataContract]
public class Booking
{
[DataMember]
public int BookingID { get; set; }
[DataMember]
public string BookingName { get; set; }
[DataMember]
public DateTime BookingStart { get; set; }
[DataMember]
public DateTime BookingEnd { get; set; }
[DataMember]
public int RoomID { get; set; }
}
预订
public void CreateBooking(Booking booking)
{
BookingEntity bookingEntity = new BookingEntity()
{
BookingName = booking.BookingName,
BookingStart = booking.BookingStart,
BookingEnd = booking.BookingEnd,
RoomID = booking.RoomID
};
BookingsModel model = new BookingsModel();
model.CreateBooking(bookingEntity);
}
预订模式:
public void CreateBooking(BookingEntity booking)
{
using (var conn = new SqlConnection("Data Source=cpm;Initial Catalog=BookingDB;Integrated Security=True"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText =
@"IF NOT EXISTS ( SELECT * FROM Bookings WHERE BookingStart = @BookingStart AND BookingEnd = @BookingEnd AND RoomID= @RoomID )
INSERT INTO Bookings ( BookingName, BookingStart, BookingEnd, RoomID ) VALUES ( @BookingName, @BookingStart, @BookingEnd, @RoomID )";
cmd.Parameters.AddWithValue("@BookingName", booking.BookingName);
cmd.Parameters.AddWithValue("@BookingStart", booking.BookingStart);
cmd.Parameters.AddWithValue("@BookingEnd", booking.BookingEnd);
cmd.Parameters.AddWithValue("@RoomID", booking.RoomID);
cmd.ExecuteNonQuery();
conn.Close();
}
}
这会更新数据库,但每次我以上述json格式提交日期时,时间都以“1970-01-01 00:00:02.013”结束。但是,当我在SQLServerManagementStudio中使用上述日期格式(“YYYY-MM-DD HH:MM:SS.mmm”)执行查询时,它会插入正确的值。此外,如果我向wcf提交毫秒datetime,则会插入正确的日期。问题似乎在于我提交的格式。我对这个问题有点不知所措。我真的不明白它为什么这么做。任何帮助都将不胜感激。谢谢。你能检查一下你的JSON格式吗。它应该是yyyy-MM-dd。您有yyyy-dd-MM
"\/Date(2012-03-26 09:00:00.000)\/"
我想,在形成Json字符串时,您不会使用Json解析器。如果使用一个,您将看到中的DateTime类未序列化到此表单
2012-26-03 09:00:00.000
应该是这样的
{"BookingEnd":"\/Date(1332683123765+0300)\/"}
或
#自历元(1970,1,1)以来的毫秒数
如果您有一个.NET客户端来执行POST,则使用以下方法将请求主体发布到RESTful服务:
private static byte[] ToByteArrayUsingJsonContractSer<T> (T requestBody)
{
byte[] bytes = null;
var serializer1 = new DataContractJsonSerializer(typeof(T));
var ms1 = new MemoryStream();
serializer1.WriteObject(ms1, requestBody);
ms1.Position = 0;
var reader = new StreamReader(ms1);
bytes = ms1.ToArray();
return bytes;
}
完成上述操作后,我会得到如下响应:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 334
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=XXXXXXXXXXXXXXXXXXXXXX; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Mon, 26 Mar 2012 09:54:53 GMT
<Booking xmlns="http://schemas.datacontract.org/2004/07/XMLService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><BookingEnd>2012-03-27T10:54:17.631+01:00</BookingEnd><BookingID>1</BookingID><BookingName>client sent from server</BookingName><BookingStart>2012-03-26T10:54:17.631+01:00</BookingStart><RoomID>2</RoomID></Booking>
HTTP/1.1200正常
缓存控制:专用
内容长度:334
内容类型:application/xml;字符集=utf-8
服务器:Microsoft IIS/7.5
X-AspNet-Version:4.0.30319
设置Cookie:ASP.NET\u SessionId=xxxxxxxxxxxxxxxxxxxxxxxx;路径=/;HttpOnly
X-Powered-By:ASP.NET
日期:2012年3月26日星期一09:54:53 GMT
2012-03-27T10:54:17.631+01:001从服务器发送的客户端2012-03-26T10:54:17.631+01:002
请注意bookingName元素,它附加了一个来自服务器的字符串(我用于测试)booking.BookingEnd&booking.BookingStart变量的值是多少?@Dmitriy Reznik,booking.BookingStart,和booking.BookingEnd应该是json字符串的BookingStart和BookingEnd值。这样,您就可以将给定的字符串解析为正确的日期时间。感谢您指出这一点。我改变了它,它仍然是一样的。我可以在查询中运行该值,但不能在json字符串中运行。感谢您的响应。我要试试这个,看看我过得怎么样!谢谢
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 334
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=XXXXXXXXXXXXXXXXXXXXXX; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Mon, 26 Mar 2012 09:54:53 GMT
<Booking xmlns="http://schemas.datacontract.org/2004/07/XMLService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><BookingEnd>2012-03-27T10:54:17.631+01:00</BookingEnd><BookingID>1</BookingID><BookingName>client sent from server</BookingName><BookingStart>2012-03-26T10:54:17.631+01:00</BookingStart><RoomID>2</RoomID></Booking>