通过数据库判断登陆状态
在此之前进行了假设登陆成功. 现在通过RequestLogin连接数据库进行真实登陆后获取结果.
使用MS SQL Server.大家也可选择使用SQL Server Express或者Developer Edition. 还可使用 MySQL, AWS Aurora, RDS 等等.. 如果对数据库相当熟悉即可略过本节.
生成DB 实例 "SimpleCharacterMove". 然后建立表格 "GameUser". 为进行测试创建以下记录. 输入UserID后, 添加一个stored procedure读取对应该UserID的信息. CREATE PROCEDURE [dbo].[GetGameUser] @UserID nvarchar(50) AS SELECT * from GameUser where UserID = @UserID RETURN 0 | 现在,RequestLogin远程函数下, 添加调用stored proc的代码. 调用成功的话获取password. 与用户输入的password一致的话 "登陆成功"的远程函数将被调用. DEFRMI_Simple_RequestLogin(SimpleServer) { try { CAdoConnection conn;
conn.Open(L"server=.;database=SimpleCharacterMove;trusted_connection=yes", DbmsType::MsSql);
CAdoCommand cmd;
cmd.Prepare(conn, L"GetGameUser"); cmd.AppendParameter(L"UserID", ADODB::adVarWChar, ADODB::adParamInput, id.c_str()); CAdoRecordset rs; cmd.Execute(rs);
String password2; if (!rs.GetFieldValue(L"Password", password2) || password != password2.GetString()) { m_proxy.NotifyLoginFailed(remote, RmiContext::ReliableSend, L"Invalid user ID or password"); return true; } // success! m_proxy.NotifyLoginSuccess(remote, RmiContext::ReliableSend); } catch (AdoException& e) { m_proxy.NotifyLoginFailed(remote, RmiContext::ReliableSend, StringA2T(e.what()).GetString()); } | 假设,服务器与DB网络连接中断的话, 访问DB的函数将出现异常,为防止发生添加了catch功能. 现在运行, 按Login键登录界面消失代表登陆成功.必要时,在以上代码添加debug break来观察服务器中都进行了怎样的操作. |