经过这几天的研究,总算成功的从数据库中读取到了字段内容,还要多亏了好心人的帮助。
一、首先要写一个存储过程:脚本如下
----------------------------------------------------------------------------------------------------
USE QPAccountsDB
GO
IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[dbo].[GSP_GP_PlayTimeCount]') and OBJECTPROPERTY(ID, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[GSP_GP_PlayTimeCount]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
----------------------------------------------------------------------------------------------------
-- 获取游戏时长
CREATE PROC GSP_GP_PlayTimeCount
@dwUserID INT -- 用户 I D
AS
-- 属性设置
SET NOCOUNT ON
-- 执行逻辑
BEGIN
-- 变量定义
DECLARE @PlayTimeCount INT --游戏时长
DECLARE @UserID INT
-- 查询用户
SELECT @PlayTimeCount=PlayTimeCount
FROM QPTreasureDBLink.QPTreasureDB.dbo.GameScoreInfo WHERE UserID=@dwUserID
-- 输出变量
SELECT @PlayTimeCount AS PlayTimeCount
END
RETURN 0
GO
----------------------------------------------------------------------------------------------------
二、在服务端的DataBaseEngineSink.cpp下的登录成功CDataBaseEngineSink::OnLogonDisposeResult这个函数,添加如下代码,代码存放位置为上一个数据库获取字段结束。
m_AccountsDBAide.ResetParameter();
m_AccountsDBAide.AddParameter(TEXT("@dwUserID"),LogonSuccess.dwUserID);
m_AccountsDBAide.ExecuteProcess(TEXT("GSP_GP_PlayTimeCount"),true);
LogonSuccess.szPlayTimeCount=m_AccountsDBAide.GetValue_DWORD(TEXT("PlayTimeCount"));
----------------------------------------------------------------------------------------------------
三、可以增加调试手段来查看数据是否正确,比如显示信息在登录服务器消息框。
CString str;
str.Format(TEXT("PlayTimeCount=%d %d"),pCMDLogonSuccess->dwGameID,pDBOLogonSuccess->szPlayTimeCount);
CTraceService::TraceString(str,TraceLevel_Debug);
比如在游戏大厅增加弹窗效果:
CString str;
str.Format(TEXT("time=%d"),pGlobalUserData->dwPlayTimeCount);
AfxMessageBox(str);
文件流模式:
FILE *fp=fopen("S积分记录.txt","a+");
fprintf(fp,"need_user_score:%lld,user_leave_score:%lld,GetUserScore():%lld\n",need_user_score,user_leave_score,server_user_item->GetUserScore());
fclose(fp);
----------------------------------------------------------------------------------------------------
四、注意结构体问题,新增的字段切记不要放在结构体的尾端,尾端有可能本来是用于计算结构体大小的。
//登录成功
struct DBO_GP_LogonSuccess
{
//属性资料
WORD wFaceID; //头像标识
DWORD dwUserID; //用户标识
DWORD dwGameID; //游戏标识
DWORD dwGroupID; //社团标识
DWORD dwCustomID; //自定索引
DWORD dwUserMedal; //用户奖牌
DWORD dwExperience; //经验数值
DWORD dwLoveLiness; //用户魅力
DWORD dwGoldZl; //金币种类
TCHAR szPassword[LEN_MD5]; //登录密码
TCHAR szAccounts[LEN_ACCOUNTS]; //登录帐号
TCHAR szNickName[LEN_NICKNAME]; //用户暱称
TCHAR szGroupName[LEN_GROUP_NAME]; //社团名字
//游戏时长
DWORD szPlayTimeCount;
//用户成绩
SCORE lUserScore; //用户游戏币
SCORE lUserInsure; //用户银行
//用户资料
BYTE cbGender; //用户性别
BYTE cbMoorMachine; //锁定机器
TCHAR szUnderWrite[LEN_UNDER_WRITE]; //个性签名
//会员资料
BYTE cbMemberOrder; //会员等级
SYSTEMTIME MemberOverDate; //到期时间
//描述信息
TCHAR szDescribeString[128]; //描述消息
//切记新增字段不要放在尾端。
};
五、需要不断的跟踪调试,才能达到想要的效果,最后我成功在客户端获取到了该PlayTimeCount字段信息。