MySql получать обновления с момента последней NOW () асинхронной проблемы - PullRequest
0 голосов
/ 22 сентября 2011

У меня проблемы, я пытаюсь получать обновления из таблицы сообщений для моего веб-чата.Для этого я сохраняю дату последнего времени в сеансе и пытаюсь получать сообщения, отправленные между последним временем и настоящим.

Однако в нем отсутствуют некоторые сообщения, и я не могу понять, почему.Что-то не так с моим MySQL сравнения даты и времени?

Если я обновляю страницу, она сбрасывает переменную сеанса, и отображаются все сообщения.В JavaScript я вызываю веб-метод каждые 2 + обратного вызова.

private string LastNow
{
    get
    {
        return Session["last_now"] as string ?? 
                   (string)(Session["last_now"] = string.Empty);
    }

    set
    {
        Session["last_now"] = value;
    }
}

[WebMethod(EnableSession=true)]
public object GetMessages(int id, int roomId)
{
    string lastDt = LastNow;
    /* EDIT */
    string now = MySqlHelper.ExecuteScalar(
        connstr, "SELECT CAST(NOW() AS CHAR);") as string;

    // if the session variable is null or empty, 
    // get all messages up to now, else most recent
    string dtclause = 
        !string.IsNullOrWhiteSpace(lastDt) ?
        string.Format(" AND sent_dt > '{0}' AND sent_dt <= '{1}'", lastDt, now) :
        string.Format(" AND sent_dt <= '{0}'", now);

    string sql =
        string.Format(
        "SELECT user_id, type, message FROM Chat.Message WHERE room_id={0}{1};",
        roomId, dtclause);

    object ret = null;

    try // with a finally, always store last update time
    {
        using (DataSet msgset = 
               MySqlHelper.ExecuteDataset(Common.SupportDatabase, sql))
        {
            DataTable msgtable = msgset.Tables[0];

            if (msgtable != null)
            {
                DataRow[] rows = msgtable.Select();

                if (rows != null && rows.Length > 0)
                {
                    ret = from msg in rows
                            select new
                            {
                                id = msg["user_id"],
                                type = msg["type"],
                                message = msg["message"]
                            };
                }
            }
        }
    }
    finally
    {
        LastNow = now;                
    }


    return ret;
}

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Не должно быть никаких причин для разбора даты в вашем коде. MySQL уже выведет функцию now() в формате yyyy-mm-dd hh:mm:ss, поэтому просто сохраните необработанную строку, которую возвращает MySQL. Синтаксический анализ DateTime потенциально может вызвать такие вещи, как переход на часовой пояс и переход на летнее время, что приведет к порче временных меток. Вместо этого просто высосайте временную метку и вставьте ее обратно, без преобразования.

0 голосов
/ 23 сентября 2011

Я подозреваю, что поскольку вы вычисляете NOW () немного раньше, чем выполняете запрос, вы пропускаете некоторые сообщения, которые появляются между ними. Попробуйте получить дату из базы данных в том же запросе, в котором вы получаете сообщения.

...