Я работаю над онлайн-игрой, и у меня есть проблема с получением результатов ms-sql в другой файл cpp.
cpp file1, чтобы запустить запрос:
databaseManager.Query( hDB, new CQuery_AuthServer(req->awchUserId, req->awchPasswd);
req-> awchUserId и req-> awchPasswd - данные из сокета (имя пользователя и пароль)
теперь на cpp file2 я выполняю запрос внутри класса
class CQuery_AuthServer : public CNtlQuery
{
public:
CQuery_AuthServer(const WCHAR * lpszUserID, const WCHAR * lpszUserPW)
{
ZeroMemory( m_szUserID, MAX_SIZE_USER_ID + 1 );
ZeroMemory( m_szUserPW, MAX_SIZE_USER_PW + 1 );
memcpy(m_szUserID, lpszUserID, MAX_SIZE_USER_ID);
memcpy(m_szUserPW, lpszUserPW, MAX_SIZE_USER_PW);
}
int ExecuteQuery(CNtlDatabaseConnection * pConnection)
{
FIND_SQLUNIT( SP_AuthLogin, pConnection, pSqlUnit2 );
if( NULL == pSqlUnit2 )
{
return NTL_FAIL;
}
strncpy_s( pSqlUnit2->m_szUserID, m_szUserID, MAX_SIZE_USER_ID );
strncpy_s( pSqlUnit2->m_szUserPW, m_szUserPW, MAX_SIZE_USER_ID );
pSqlUnit2->Exec();
printf("ExecuteQuery Done: result: %i ACC ID: %i \n", pSqlUnit2->m_nResultCode, pSqlUnit2->m_dwAccountID );
return NTL_SUCCESS;
}
public:
char m_szUserID[MAX_SIZE_USER_ID + 1];
char m_szUserPW[MAX_SIZE_USER_PW + 1];
};
Это необходимо для запроса
BEGIN_DECLARE_SQLUNIT( SP_AuthLogin, "{ ? = call AuthLogin(?,?,?) }" )
BEGIN_VARIABLE()
char m_szUserID[MAX_SIZE_USER_ID + 1];
char m_szUserPW[MAX_SIZE_USER_PW + 1];
int m_dwAccountID;
int m_nResultCode;
END_VARIABLE()
BEGIN_PARAM(3)
PARAM_ENTRY(SQL_PARAM_OUTPUT, m_nResultCode)
PARAM_ENTRY_STR(SQL_PARAM_INPUT, m_szUserID)
PARAM_ENTRY_STR(SQL_PARAM_INPUT, m_szUserPW)
PARAM_ENTRY(SQL_PARAM_OUTPUT, m_dwAccountID)
END_PARAM()
END_DECLARE_SQLUNIT()
Теперь я могу получить результат, но результат работает только внутри int ExecuteQuery. Результаты запроса:
pSqlUnit2->m_nResultCode
pSqlUnit2->m_dwAccountID
как я могу получить эти 2 результата в первом файле cpp, где я сделал запрос?
edit: первый файл cpp:
void CClientSession::SendCharLogInReq(CNtlPacket * pPacket)
{
sUA_LOGIN_REQ * req = (sUA_LOGIN_REQ *)pPacket->GetPacketData();
HDATABASE hDB = INVALID_HDATABASE;
CNtlDatabaseManager databaseManager;
databaseManager.Query( hDB, new CQuery_AuthServer(req->awchUserId, req->awchPasswd) );
//WANT RESULT HERE
}
Я действительно не знаю, что делать. Im действительно новичок
вот полный источник https://www.sendspace.com/file/oc5v34
на PacketAuthServer.cpp Я запускаю запрос в AuthQueryServer.h Я выполняю запрос
Не обращайте внимания на предыдущий ответ. Проблема с предыдущим ответом заключается в том, что он ожидал, что databaseManager.Query
будет синхронным и выполнить CQuery_AuthServer::ExecuteQuery
прежде чем он вернется к вызывающему. На самом деле это не так - он просто добавляет запрос в очередь, и ваша структура управления базами данных не дает вам возможности дождаться завершения этого запроса.
Вы должны прочитать руководство NtlDatabase, чтобы узнать, как делать синхронные вызовы базы данных
std::string
вместо массивовchar
. Смотрите такжеstd::string::c_str()
.