首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#WinForm 利用SQL临时表防止客户端重复登陆,该怎么处理

2013-10-14 
C#WinForm 利用SQL临时表防止客户端重复登陆存储过程:set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo--

C#WinForm 利用SQL临时表防止客户端重复登陆
存储过程:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:wfei
-- Create date: 2013.10.10 15:55
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[RepeatLogin] 
-- Add the parameters for the stored procedure here
@username varchar(15) = null , 
@outResult int = 1 output 
AS
declare @view_sql varchar(100)  
--object_id函数判断操作员账号不存在(没有的登录)  
if OBJECT_ID ('tempdb.dbo.##'+@username )is null  
begin   
--创建临时表  
set @view_sql ='create table ##'+@username+'(username varchar(15))'  
exec(@view_sql)  
--out参数设置为0(账号没有登录)  
set @outResult =0  
end   
--账号存在  
else   
--out参数为1
  
set @outResult =1 

登陆后调用执行存储过程函数:
SqlParameter parameter1=new SqlParameter("@username",SqlDbType.VarChar,15);
                            SqlParameter parameter2 = new SqlParameter("@outResult", SqlDbType.Int);
                            string name = user.Username;
                            int k=multipleDB.executeProcess(name,parameter1, parameter2);
                            MessageBox.Show(k.ToString());
                            if (k==1)
                            {
                                MessageBox.Show("用户已登陆!");
                            }
                            else
                            {
                                ///将登陆日志插入用户日志中
                            }


执行存储过程函数:
public int  executeProcess(string name,SqlParameter parameter1,SqlParameter parameter2)
        {
           SqlConnection?sqlcon?=?this.getcon();???//获取连接字符串????
           try
           { ?????????
              sqlcon.Open();???????//打开连接??????
??????        SqlCommand cmd = new SqlCommand();
              cmd.Connection = sqlcon;
              cmd.CommandType = CommandType.StoredProcedure;
              cmd.CommandText = "RepeatLogin";
              cmd.Parameters.Add(parameter1);
              cmd.Parameters[0].Value = name;
              cmd.Parameters.Add(parameter2).Direction=ParameterDirection.ReturnValue;
              cmd.ExecuteNonQuery();
              return Convert.ToInt32(cmd.Parameters[1].Value);
           }
           catch (SqlException e)
           {
                MessageBox.Show(e.ToString(),?"信息提示",?MessageBoxButtons.OK,?MessageBoxIcon.Information);


                return 2;
           }
           finally
           {
               sqlcon.Close();
               sqlcon.Dispose();
           }           
        }


大家帮忙看看哪有问题,虽然执行了但是还是可以重复登陆
[解决办法]
临时表的作用域只限在当前连接中,也就是说执行完存储过程临时表就释放了.
重复登录怎么能用临时表呢,
给你一个思路:
可以操作员表加一个是否登录字段,为解决软件异常关闭后不能登录的问题,软件成功登陆后,定时提交服务器当前操作员正在登录的状态和最后更新的时间,如果再次有登录且登录状态为true则判断登录状态时间是否超时,如果超时则允许登录.
正常关闭软件时将登录状态设为false
[解决办法]
1、登录窗口使用Single模式设计
2、数据库中标记是否登录
3、新用户登陆后,将原用户踢出去并给个提示窗口(像QQ弹消息那样)
  可以新写一个可执行文件放在特定位置,登陆后启动踢人
  (使用Socket、WCF等)
[解决办法]
你的业务是如何的,是允许重复登录并强制下线之前的人,还是在第一个人登录后后续所有人必须等其下线后才能登录

热点排行