思路一:create procedure gp_findtemptable /* 寻找以操作员工号命名的全局临时表 * 如无则将out参数置为0并创建该表,如有则将out参数置为1  * 在connection断开连接后,全局临时表会被SQL Server自动回收* 如发生断电之类的意外,全局临时表虽然还存在于tempdb中,但是已经失去活性* 用object_id函数去判断时会认为其不存在. */@v_userid varchar(6), -- 操作员工号@i_out int out -- 输出参数 0:没有登录 1:已经登录asdeclare @v_sql varchar(100)if object_id('tempdb.dbo.##'+@v_userid) is nullbegin        set @v_sql = 'create table ##'+@v_userid+'(userid varchar(6))'        exec (@v_sql)        set @i_out = 0endelse        set @i_out = 1方法1是建立一个存储过程,使用LINQ调用没实现(返回值始终为0),
换用ADO.NET调用该存储过程,可以得到准确的返回值,但遇到问题了,登录完之后关闭网页,再登陆提示已经登录,
再试一次才可以等进去。ADO.NET的方法如下(con未Close,直接调用Close方法的话返回值始终为0):
con之前已经在构造函数中实例化。        /// <summary>
        /// 内容摘要: 验证是否重复登录(使用临时表)
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>返回整型数据1表示已经登录,O表示没登陆,-1表示异常</returns>
        public int IsLogin(string userId)
        {
            if (userId != "1")//id为1的用户允许重复登录
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandText = "gp_findtemptable";//存储过程名
                    cmd.CommandType = CommandType.StoredProcedure;
                    con.Open();
                    cmd.Connection = con;                    SqlParameter param1 = new SqlParameter("@v_userid", userId);//存储过程输入参数 
                    cmd.Parameters.Add(param1);//添加参数                    SqlParameter param2 = new SqlParameter();
                    param2.ParameterName = "@i_out";//存储过程输出参数
                    param2.SqlDbType = SqlDbType.Int;//参数类型
                    param2.Direction = ParameterDirection.Output;//指定参数类型
                    cmd.Parameters.Add(param2);//添加参数                    cmd.ExecuteNonQuery();
                    return Convert.ToInt32(param2.Value.ToString());
                }
                catch
                {
                    return -1;//异常则返回-1
                }
            }
            else
            {
                return 0;//id为1的用户允许重复登录
            }        }
其他思路
使用Application结合Session,
利用Application全局性以及Session的Session_end事件,
还有JS的判断网页关闭,也未实现。想问问大家有没有好的思路,或者和大家共同讨论一下思路一的问题在哪里。
需要的话,另开贴追加分也行。

解决方案 »

  1.   

    同意楼上的LZ的Session_end有时候失效的.我这方法觉得不准.
      

  2.   

    问题的重点就是,如何统计当前已经在线的用户。
    例如将 所有在线用户保存到数据库中,其他人登录的时候,在这个在线库里面查找,如果没有就允许登录,如果存在,就选择一种处理办法(踢出旧的/禁止新的)。
    缺点是,由于Session判断的存在,一旦用户登录就会导致,在session超时之前,无法判断用户是否掉线了。
    所以就需要在用户每次操作的时候进行最新时间更新,然后制作一个时间验证,超过时间没有操作的用户,都判断为掉线,直接踢掉就行了。这样就可以解决,用户在意外掉线(客户端死机等)情况的发生时,在短时间内(例如规则为2分钟超时)就可以重新登录。
      

  3.   

    http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html这个不错,可行