C# 通过WCF将JSON日期时间转换为SQL Server数据库

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

在过去的几天里,我注意到一个问题,我提交到sql server数据库的日期是错误的。我有一个网页,用户可以在那里预订设施。此网页采用名称、日期、开始时间和结束时间(BookingID是事务所必需的,但由数据库生成),我将其格式化为JSON字符串,如下所示:

{"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>