【问题标题】:MySql get updates since last NOW() asynchronous problemMySql 获取自上次 NOW() 以来的更新异步问题
【发布时间】:2011-11-23 03:43:40
【问题描述】:

我遇到了问题,我正在尝试从消息表中获取更新以进行网络聊天。为此,我将最后一个日期时间存储在会话中,并尝试获取在最后一个日期时间和现在之间发送的消息。

但是,它缺少一些消息,我不知道为什么。我的 mysql 日期时间比较有问题吗?

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

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

【问题讨论】:

    标签: c# mysql web-services select where-clause


    【解决方案1】:

    不应该有任何理由在您的代码中进行日期解析。 MySQL 已经以yyyy-mm-dd hh:mm:ss 格式输出now() 函数,因此只需存储MySQL 返回的原始字符串。 DateTime 解析可能会引发诸如时区和夏令时转换之类的事情,这将搞砸时间戳。取而代之的是,只需将时间戳吸出,然后将其塞回原处,未转换。

    【讨论】:

    • .Net mysql 连接器将“SELECT NOW()”值存储为 MySqlDateTime 数据类型,而不是原生字符串。 :-(
    • 您可以强制使用CAST(now() AS varchar)DATE_FORMAT(now() '%Y-%m-%d %h:%i:%s') 的字符串
    • varchar 对我不起作用(可能是 MySql 的怪癖),但 "CAST(NOW() AS CHAR)" 对我有用
    • :虽然这似乎有帮助(没有任何经验证据),但它并没有完全解决问题。我认为这与我的发送(插入)的异步性质有关
    • 我放弃了这个方法,消息有一个自动递增的 ID,所以我现在跟踪最后一个发送的消息
    【解决方案2】:

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

    【讨论】:

    • 可能,但如果不使用 NOW() 填充整个列,我想不出该怎么做。此外,调试 web 服务显示值是有效范围(应该返回结果)。我认为我与插入有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2022-07-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多