用GUID,当用户登录就分配一个GUID与数据库的交互都用到这个GUID

解决方案 »

  1.   

    把Session放在数据库中,
    在登陆的时候作检测此人
      

  2.   

    哎呀,恕我胡说了一次,犯了个低级错误
    用session可以解决
      

  3.   

    可不可以把在线用户存到一个hashTable里面,这个table放到application里
      

  4.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.Data;
    using System.Drawing;
    using System.Threading;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace office.Online
    {
    public struct User
    {
    public string username;
    public DateTime lasttime;  
    public DateTime curtime;
    }

    /// <summary>
    /// online 的摘要说明。
    /// </summary>
    public class online
    {
    private static DataTable _alluser;
    const int DELAY_TIMES = 10000 ;    //定义执行的时间间隔为5秒
    const int DELAY_SECONDS=40;     //将用户掉线时间设置为40秒
         
    private Thread thread ;      //定义内部线程
    private static bool _flag=false;   //定义唯一标志 public online()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    if(_alluser==null)
    {
    //define user list 
    // Declare variables for DataColumn and DataRow objects.
    _alluser = new DataTable("onlineuser"); DataColumn myDataColumn;
    // Create new DataColumn, set DataType, ColumnName and add to DataTable.    
    // Create username column.
    myDataColumn = new DataColumn();
    myDataColumn.DataType = System.Type.GetType("System.String");
    myDataColumn.ColumnName = "username";
    myDataColumn.AutoIncrement = false;
    myDataColumn.Caption = "username";
    myDataColumn.ReadOnly = false;
    myDataColumn.Unique = true;
    _alluser.Columns.Add(myDataColumn); // Create lasttime column.
    myDataColumn = new DataColumn();
    myDataColumn.DataType = System.Type.GetType("System.DateTime");
    myDataColumn.ColumnName = "lasttime";
    myDataColumn.AutoIncrement = false;
    myDataColumn.Caption = "lasttime";
    myDataColumn.ReadOnly = false;
    myDataColumn.Unique = false;
    _alluser.Columns.Add(myDataColumn); // Create curtime column.
    myDataColumn = new DataColumn();
    myDataColumn.DataType = System.Type.GetType("System.DateTime");
    myDataColumn.ColumnName = "curtime";
    myDataColumn.AutoIncrement = false;
    myDataColumn.Caption = "curtime";
    myDataColumn.ReadOnly = false;
    myDataColumn.Unique = false;
    _alluser.Columns.Add(myDataColumn); }
    }
    //功能说明:将当前用户加入在线列表
    public bool  AddUserToOnLine(User user)
    {
    string strExpr;
    strExpr = "username='" + user.username + "'"; 
    DataRow[] curUser;
    curUser = _alluser.Select(strExpr); if (curUser.Length >0 )
    {
    for(int i = 0; i < curUser.Length; i ++)
    {
    curUser[i]["curtime"]=DateTime.Now;
    }
    }
    else
    {
    DataRow myRow;
         myRow = _alluser.NewRow();
    // Then add the new row to the collection.
    myRow["username"] = user.username;
    myRow["lasttime"] = user.lasttime;
    myRow["curtime"] = DateTime.Now;
    _alluser.Rows.Add(myRow);
    }
    _alluser.AcceptChanges();
    return true;
    }
    //功能说明:判断某用户是否在线
    //返回值:TRUE代表在线,FALSE不在
    public  Boolean IsUserOnLine(string username)
    {
    if(_alluser==null)
    {
    return (false);
    }
    else
    {
    string strExpr;
    strExpr = "username ='" + username + "'"; 
    DataRow[] curUser;
    // Use the Select method to find all rows matching the filter.
    curUser = _alluser.Select(strExpr); if (curUser.Length >0 )
    {
    return true;    
    }
    else
    {
    return false;
    }
    }
    } //功能说明:更新用户在线时间 public Boolean CheckUserOnLine(string username)
    { //需要先判断用户是否已经在用户列表中了
    if(_alluser!=null)
    {
    User newuser=new User();
    newuser.username= username;
    newuser.lasttime=newuser.curtime=DateTime.Now;
    AddUserToOnLine(newuser);
    }
    return true;
    }
    //功能说明:统计在线用户数目
    public int NumUserOnLine()
    {
    if(_alluser!=null)
    {
    string strExpr;
    strExpr = "username>''"; 
    DataRow[] curUser;
    // Use the Select method to find all rows matching the filter.
    curUser = _alluser.Select(strExpr);
    return curUser.Length;
    }
    return 0;
    }
    //功能说明:删除在线用户
    public void DelUserOnLine(string username)
    {
    if(_alluser!=null)
    {
    string strExpr;
    strExpr = "username ='" + username + "'"; 
    DataRow[] curUser;
    // Use the Select method to find all rows matching the filter.
    curUser = _alluser.Select(strExpr);
    if (curUser.Length >0 )
    {
    //删除这些记录
    for(int i = 0; i < curUser.Length; i ++)
    {
    curUser[i].Delete();
    }
    _alluser.AcceptChanges();
    }
    }
    }
    //启动守护线程
    public void CheckOnline()
    {
    if (!_flag)
    {
    _flag= true;
    this.thread = new Thread(new ThreadStart(ThreadProc)) ;
    thread.Name = "online user" ;
    thread.Start() ;
    }
    }
      
      
    internal void ThreadProc()
    {
    while(true)  
    {
    //我是将该用户的最新时间加上30秒,然后和当前时间比较,小与当前时间,
    //则表示该用户已经吊线,则删除他的记录
    //开始检查是否有用户过期了    
    string strExpr;
    strExpr = "curtime < '" + DateTime.Now.AddSeconds( 0 - DELAY_SECONDS) + "'"; 
    DataRow[] curUser;
    // Use the Select method to find all rows matching the filter.
    curUser = _alluser.Select(strExpr); if (curUser.Length >0 )
    {
    //删除这些记录
    for(int i = 0; i < curUser.Length; i ++)
    {
    curUser[i].Delete();
    }
    _alluser.AcceptChanges();
    }
    Thread.Sleep(DELAY_TIMES) ;
    }
    }
    }
    }
      

  5.   

    大家都说用session,能不能举个session的例子,最好贴出代码.
      

  6.   

    如果我的用户登录是保存在 Cookies 里,那该怎么做?
      

  7.   

    在数据库登陆代码上加上一个标记YesOrNo(已经有人登陆置1,无人登陆置0),放入Application对象中.既:
    if(Application["YesOrNo"]==null)
    {
       Application.add("YesOrNo")=1;
    }
    else
    {
      Application.add("YesOrNo")=0;
    }
    在使用时判断Application("YesOrNo")是否为1,是则有人,为0.......
      

  8.   

    呵呵,这个问题不好做。进入系统时可以判断在线用户。但是退出时你就不好判断了,你怎么知道别人下线了呢。 imfine() 的方法好像是聊天室中的代码吧。不过imfine() 的方法在多页面操作中如何来取得用户的退出呢??
      

  9.   

    最好使用数据库,其他的都不怎么好用,
    首先删除过期用户,然后查询是否在线
    delete from Forum_Online where Datediff(minute,Forum_Online_Now,getdate())>10 //十分钟没有反映登陆的时候向数据库添加这个人的信息,
      

  10.   

    老大,那个SQL是什么意思哦,我不大懂,,
      

  11.   

    谁知道   ilqtj(飞天)  那个个具体代码是怎么样的吗?
      

  12.   

    用Application和Session都不是很好,建议用SQL来存储用户登录的信息.
    在表中有一个字段来存储这个用户的登录ID(或者是随机流水号),在系统中任何一个地方都要判断此ID(或随机流水号)是否存在,以判断此用户会话是否有效.
    用户登录一次就要更改一次该随机流水号.
      

  13.   

    登录时将SESSION提交,改变用户状态标识。
    页面超时,或关闭窗口时提交SESSION表示用户离开。
    复位用户状态标识。
      

  14.   

    可以考虑 借鉴 msn的做法
    呵呵~~~~
    只允许一个人在线么
    每次登录时,把登录时间写道数据库里面
    每个页面检查 登录时间,如果不符,说明其他人使用这个账号
      

  15.   

    错了,写道数据库的同时,session也写下 登录时间
    每个页面检查 数据库与session
    如果不相符,说明 自己掉线,或者别人使用这个账号
    呵呵