首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql获取自last NOW()以来的更新异步问题

问MySql获取自last NOW()以来的更新异步问题
EN

Stack Overflow用户
提问于 2011-09-23 03:55:34
回答 2查看 196关注 0票数 0

我遇到麻烦了,我正在尝试从我的网络聊天的消息表中获取更新。为此,我将最后一个datetime存储在一个会话中,并尝试获取在最后一个datetime和现在之间发送的消息。

然而,它遗漏了一些消息,我不知道为什么。我的mysql日期时间比较有问题吗?

如果我刷新页面,它将重置会话变量,并显示所有消息。在javascript中,我每隔2+个回调秒就调用一次web方法。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-23 04:00:27

不应该有任何理由在你的代码中进行日期解析。MySQL已经以yyyy-mm-dd hh:mm:ss格式输出了now()函数,所以只存储MySQL返回的原始字符串。DateTime解析可能会导致时区和夏令时转换等问题,这会破坏时间戳。取而代之的是,把时间戳吸出来,然后把它放回去,不进行转换。

票数 1
EN

Stack Overflow用户

发布于 2011-09-23 04:28:01

我怀疑,因为您计算NOW()的时间比执行查询的时间稍早,所以您遗漏了一些介于两者之间的消息。在获取消息的同一查询中,尝试从数据库中获取日期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7520669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档