Дата JSON в базу данных SQL Server через WCF - PullRequest
0 голосов
/ 25 марта 2012

За последние пару дней я заметил проблему, когда мои данные, отправленные в базу данных сервера sql, неверны.У меня есть веб-страница, где пользователи могут забронировать услуги.Эта веб-страница содержит имя, дату, время начала и время окончания (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}

Затемпередается службе WCF, которая обрабатывает вставку базы данных следующим образом:

[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; }

}

Booking.svc

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();

        }
    }

Это обновляетбазы данных, но время заканчивается "1970-01-01 00: 00: 02.013" каждый раз, когда я отправляю дату в вышеуказанном формате json.Однако, когда я делаю запрос в студии управления SQL-сервером с указанным выше форматом даты («ГГГГ-ММ-ДД ЧЧ: ММ: СС.ммм»), он вставляет правильные значения.Кроме того, если я отправляю миллисекундную дату и время в wcf, вставляется правильная дата.Кажется, проблема в формате, который я отправляю.Я немного заблудился с этой проблемой.Я действительно не понимаю, почему он это делает.Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Полагаю, вы не используете анализатор Json, пока формируете строку JSON. Если вы его используете, вы увидите, что класс DateTime не сериализован в эту форму 2012-26-03 09:00:00.000

Это должно быть что-то вроде

{"BookingEnd":"\/Date(1332683123765+0300)\/"}

или

{"BookingEnd":"\/Date(1332683194843)\/"}

Количество миллисекунд с начала эпохи (1970,1,1)


public class TestClass
{
    public DateTime BookingEnd;
}

//Using Json.Net
var str1 = JsonConvert.SerializeObject(new TestClass() { BookingEnd = DateTime.Now });

//Using JavaScriptSerializer 
JavaScriptSerializer ser = new JavaScriptSerializer();
var str2 = ser.Serialize(new TestClass() { BookingEnd = DateTime.Now });

//Using DataContractJsonSerializer 
MemoryStream m = new MemoryStream();
DataContractJsonSerializer ser2 = new DataContractJsonSerializer(typeof(TestClass));
ser2.WriteObject(m, new TestClass() { BookingEnd = DateTime.Now });
string str3 = Encoding.UTF8.GetString(m.ToArray());
0 голосов
/ 26 марта 2012

Если у вас есть клиент .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;
        }

Когда у вас есть байты тела запроса, просто отправьте его в поток запроса и наблюдайте за ним с помощью Fiddler, и вы должны увидеть свой JSON-запрос. Убедитесь, что для вашего Content-Type установлено значение application/json

Пожалуйста, найдите образец запроса, который я использовал, используя вышеуказанный метод, с датой начала в качестве DateTime.Now и датой окончания бронирования в качестве DateTime.Now.AddDays (1)

POST http://localhost/SampleService/Service1.svc/postmethod/new HTTP/1.1
Content-Type: application/json
Host: rajeshwin7
Content-Length: 144
Expect: 100-continue
Connection: Keep-Alive

{"BookingEnd":"\/Date(1332842057631+0100)\/","BookingID":1,"BookingName":"client sent","BookingStart":"\/Date(1332755657631+0100)\/","RoomID":2}

И как только я это сделаю, я получу ответ, как показано ниже:

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>

Обратите внимание на элемент bookingName, к которому добавлена ​​строка с сервера (которую я использовал для тестирования)

0 голосов
/ 25 марта 2012

Можете ли вы проверить свой формат JSON.Это должен быть гггг-мм-дд.У вас yyyy-dd-MM

"\/Date(2012-03-26 09:00:00.000)\/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...