我有一个桌面C#应用程序,几个客户端连接到SQL服务器。每个用户都有一个ID和密码。我想要的是防止已经登录的用户从另一台计算机登录。
我通过在登录时更新数据库中的字段'UserLoggedIn'= true 来实现它,当用户将字段更新为 False 时。但是这个解决方案并不是最优的,如果系统崩溃或计算机意外关闭,该值将在数据库中保持“UserLoggedIn”= True,并且该用户将永远无法再次登录系统。
最佳解决方案是什么,并阻止已登录的用户从另一台计算机登录?
答案 0 :(得分:4)
而不是true
,在数据库中存储时间戳。确保在用户登录时定期更新。
当他们登录时,如果它不是太新的话,请允许它们。也就是说:如果你在最后(比方说)30秒内从另一台PC上看过它们,那么请考虑该会话仍然存在,并拒绝新登录。
这样,如果他们的其他PC崩溃,时间戳将不会更新,并最终会过期。
更新频率应该是到期超时的两倍。例如,如果您希望会话有效期为1分钟,则应每30秒更新一次时间戳。
答案 1 :(得分:0)
我建议您使用以下查询检查用户是否已建立与数据库的连接
SELECT loginame as LoginName,program_name
FROM sys.sysprocesses
WHERE db_name(dbid)='my_database' and loginame='test_user'
如果返回的记录数大于零,那么您可以假设用户已经从您的应用程序连接到数据库。
如果查看MSDN中的connection string属性,您将找到以下感兴趣的属性。可以将这两个属性添加到现有连接字符串中,以进一步改进可在上面的查询中定义的过滤器
应用程序名称 - 应用程序的名称,如果未提供应用程序名称,则为“.Net SqlClient Data Provider”。 (=上表中的program_name)
工作站ID - 连接到SQL Server的工作站的名称。 (=上表中的主机名)
我相信无论客户端崩溃如何,此解决方案都可以正常工作,并且不需要在任何表格中保存状态。