經過這幾天的研究,總算成功的從數據庫中讀取到了字段內容,還要多虧了好心人的幫助。
一、首先要寫一個存儲過程:腳本如下
----------------------------------------------------------------------------------------------------
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字段信息。