[Help]Get Result from Query

04/10/2018 04:38 Barameu#1
how do i get result from Stored Procedures

I try to do this
PHP Code:
void CDbManager::LoadMemberGuildOnline(CQuery *qryLPDB_OVERLAPPED_PLUS lpDbOverlappedPlus)
{
    
OutputDebugString("CDbManager::LoadMemberGuildOnline - IN");
    
CAr arRead(lpDbOverlappedPlus->lpBuflpDbOverlappedPlus->uBufSize);
    
char szQuery[QUERY_SIZE] = { 0, };
    
DWORD m_nGuildID;
    
arRead >> m_nGuildID;
    
CMover    mover;

    
sprintf(szQuery"{ call CHARACTER_01_DBF.dbo.GUILD_MEMBER_COUNT('%06d') }"m_nGuildID);
    if (
qry->Exec(szQuery) == FALSE)
    {
        
WriteLog("LoadMemberGuildOnline  %s, %d\t%s"__FILE____LINE__szQuery);
        
FreeRequest(lpDbOverlappedPlus);
        return;
    }
    while (
qry->Fetch())
    {
        
GUILD_MEMBER_COUNT Count;
        
Count.nCount qry->GetInt("fText");
    }

    
CDPTrans::GetInstance()->SendMemberOnline();
    
FreeRequest(lpDbOverlappedPlus);
    
OutputDebugString("CDbManager::LoadMemberGuildOnline - OUT");

But how to return back to world server ?
Thank you.

This is my procedures
Code:
ALTER PROCEDURE [dbo].[GUILD_MEMBER_COUNT]
	-- Add the parameters for the stored procedure here
 [MENTION=2189477]ngu[/MENTION]ildID	char(6)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	DECLARE [MENTION=2204251]nco[/MENTION]unt int

    -- Insert statements for procedure here
	SELECT [MENTION=2204251]nco[/MENTION]unt = COUNT(*) FROM CHARACTER_TBL WHERE serverindex = 01 AND m_idPlayer in (SELECT m_idPlayer FROM GUILD_MEMBER_TBL WHERE m_idGuild = [MENTION=2189477]ngu[/MENTION]ildID) AND MultiServer != 0

	SELECT fText = [MENTION=2204251]nco[/MENTION]unt;
END
04/13/2018 17:22 alfredico#2
Code:
void CDbManager::LoadMemberGuildOnline(CQuery *qry, LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus)
{
    OutputDebugString("CDbManager::LoadMemberGuildOnline - IN");
    CAr arRead(lpDbOverlappedPlus->lpBuf, lpDbOverlappedPlus->uBufSize);
    char szQuery[QUERY_SIZE] = { 0, };
    DWORD m_nGuildID;
    arRead >> m_nGuildID;

    sprintf(szQuery, "GUILD_MEMBER_COUNT '%06d'", m_nGuildID);
    if (qry->Exec(szQuery) == FALSE)
    {
        WriteLog("LoadMemberGuildOnline  %s, %d\t%s", __FILE__, __LINE__, szQuery);
        FreeRequest(lpDbOverlappedPlus);
        return;
    }
    while (qry->Fetch())
    {
        GUILD_MEMBER_COUNT Count;
        Count.nCount = qry->GetInt("fText");
    }

    CDPTrans::GetInstance()->SendMemberOnline();
    FreeRequest(lpDbOverlappedPlus);
    OutputDebugString("CDbManager::LoadMemberGuildOnline - OUT");
}
Did some changes. I don't understand the purpose of GUILD_MEMBER_COUNT structure, you set the value but you don't save anywhere. Now the function CDPTrans::SendMemberOnline() should send the value to worldserver but it won't because is nowhere.
Also the count(*) on stored procedure is really bad.

If you want to know online players from guild you can do it easier.
Code:
CGuild* pGuild = g_pPlayer->GetGuild();
USHORT count = 0;
if(pGuild)
{
	for(auto member : pGuild->m_mapPMember)
	{
		PlayerData* pPlayerData		= CPlayerDataCenter::GetInstance()->GetPlayerData( member.second->m_idPlayer );
		if(pPlayerData->data.uLogin > 0)
			count++;
	}
}
All guild data is available at player client. You can loop the map container and check if player is online or not.