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等)
[解决办法]
你的业务是如何的,是允许重复登录并强制下线之前的人,还是在第一个人登录后后续所有人必须等其下线后才能登录