C#中实现一个预定功能,
在预定数据表中有一个Keeptime属性表示预定截止时间
现在想实现一个自动取消预定的功能,  就是当时间超过预定截止时间时系统自动将房间改为空闲

解决方案 »

  1.   

    应该是用AJAX 有间隔的去判断!如果时间超过预定截止时间那就改变状态就可以了!
      

  2.   

    超过预定时间的时候,直接用sql语句查不行么?
    select t.description, 
    t.idle | 
    (((datediff(second, getdate(), t.keeptime) / abs(datediff(second, getdate(), t.keeptime))+1)/2)^1)
    as RoomCanReserve 
    from mytesttable t
    如果idle为1,则房间可订,否则检查日期keeptime,如果keeptime小于等于当前时间,则房间可订,否则房间不可订。
    上面的语句查出来的RoomCanReserve列的值就是结果,1为可订,0为不可订。
      

  3.   

    根本不需要额外的线程。
    数据库中状态列和时间列经过计算之后就可以得出一个动态的结果。你站在全局的角度想象一下,
    现在你有3个量:状态,预定保留时间,当前时间
    这3个量的前两个都是不变的(如果不主动修改),最后一个量是时刻变化的。
    这3个量经过4楼的sql语句计算后得出来的量,也是随时间变化的,不需要主动去修改它。
    这实际上就已经达到了“额外的线程”的目的了!因为“当前时间”就是这个线程。我不知道我说明白了没有。
      

  4.   

    不过那个Sql语句不是很懂诶?
      

  5.   

    不需要多线程的!你用AJAX 里面带的TIMER 控件就够你用了!
       简单点 自己设置每2秒或5秒
              去访问一次数据库!(不知道你的表里面有没有状态这个值 就比如 状态 1是空闲 2是预定 3有人)
    如果有状态就去判断!
              
              状态=2 时间《=当前时间! 然后能找出 需要取消预定的! 那直接把这个记录删除或者修改状态        
      

  6.   

    to:smallfz 
    你这个sql是一个比较简单的实现的方式。
    但是有两个问题,我觉得。
    第一,维护问题。 这样的sql真的不是每一个人都能花一分钟确切知道它的业务含义的。
    第二,数据一致性的问题。 如果不去修改数据库,这个房间一直其实是预定状态的(在数据库中),虽然在前台显示的是可以接受预定。
    假如已经过了预定时间,正好又要执行一些统计的数据,这个时候运算出来的数据,其实是错误的。 to:LZ
    我的建议,在数据库级别做job,每隔几分钟运行下,取消一些房间的预定状态。以上是我的一些想法,欢迎讨论再骂一句,那些说ajax的,你们知道ajax是什么吗?它不是神。 
    没有了IE窗口,没有了客户端,ajax还怎么运行啊?
    你能保证一直有个SB连着你的服务器站点,打开指定的网页,
    而且他机器上的js没有被禁用,还能一直忍受着 js的Timer的折磨而一直不关闭浏览器???ajax,客户端的东西,别赋予它太多的职能,承受不起。
      

  7.   

    再to:smallfz 
    如果我在一年或者更久之前,想法和你会非常的一致。觉得你的这个办法真的非常的棒。
    但是你做了一些系统,对数据要求比较高的话,而且统计又要求比较高的话,就会知道数据库的东西,业务含义,可能往往比我们前台的一些小的技巧要重要。原谅我说这么多吧。 是因为看到了之前的影子。如有冒犯,就当我自言自语了。呵呵
      

  8.   


        new System.Timers.Timer(1000).Elapsed +=new ElapsedEventHandler(timer_Elapsed);
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            ...
        }
    KISS = Keep It Simple and Stupid