DragonNest/Server/ServerCommon/SQLConnection.cpp

534 lines
17 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "SQLConnection.h"
#include "Log.h"
#if defined(_LOGINSERVER)
extern TLoginConfig g_Config;
#endif //
#if defined(_DBSERVER)
extern TDBConfig g_Config;
#endif //
CSQLConnection::CSQLConnection(void): m_henv(0), m_hdbc(0), m_hstmt(0), m_cThreadID(0), m_nWorldSetID(0)
{
memset(&m_szIp, 0, sizeof(m_szIp));
m_nPort = 0;
memset(&m_wszDBName, 0, sizeof(m_wszDBName));
memset(&m_wszID, 0, sizeof(m_wszID));
memset(&m_wszQuery, 0, sizeof(m_wszQuery));
m_RefCount = 0;
m_bMembershipDB = false;
m_bWorldDB = false;
m_bActozCommonDB = false;
m_bActozCommonTestDB = false;
}
CSQLConnection::~CSQLConnection(void)
{
Disconnect();
}
int CSQLConnection::Connect(char *pIp, int nPort, WCHAR *pwszDBName, WCHAR *pwszID)
{
SQLRETURN RetCode;
WCHAR wszQuery[128] = { 0, };
WCHAR wszConnStrIn[512] = { 0, };
SQLWCHAR wszConnStrOut[512] = { 0, };
SQLSMALLINT cbConnStrOutMax = 0;
Disconnect();
RetCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_henv);
if (CheckRetCode(RetCode, L"SQLAllocHandle") == 0){
RetCode = SQLSetEnvAttr(m_henv, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
if (CheckRetCode(RetCode, L"SQLSetEnvAttr") == 0){
RetCode = SQLAllocHandle(SQL_HANDLE_DBC, m_henv, &m_hdbc);
if (CheckRetCode(RetCode, L"SQLAllocHandle") == 0){
RetCode = SQLSetConnectAttr(m_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER )5, 0);
#if defined(_KRAZ) && defined(_FINAL_BUILD)
if (m_bMembershipDB)
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLActozMembershipDBPassword, SQLHOSTNAME, SQLAPPNAME );
else if (m_bWorldDB)
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLActozWorldDBPassword, SQLHOSTNAME, SQLAPPNAME );
else if (m_bActozCommonDB)
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLActozCommonDBPassword, SQLHOSTNAME, SQLAPPNAME );
else if (m_bActozCommonTestDB)
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLActozCommonDBPassword_Test, SQLHOSTNAME, SQLAPPNAME );
else
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLPASSWORD, SQLHOSTNAME, SQLAPPNAME );
#else //
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLPASSWORD, SQLHOSTNAME, SQLAPPNAME );
#if 0
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;wsid=%s;App=%s;", pIp, nPort, pwszDBName, pwszID, SQLPASSWORD, SQLHOSTNAME, SQLAPPNAME );
#else
//printf("DB Password is 3A6A7D31A8c6415 \n"); // Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ϊ̨<CEAA><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
swprintf(wszConnStrIn, L"Driver={SQL Server};Server=%S,%d;Network=dbmssocn;Database=%s;Uid=%s;Pwd=%s;", pIp, nPort, pwszDBName, pwszID, L"3A6A7D31A8c6415" );
#endif //[debug]
#endif //
if (CheckRetCode(RetCode, L"SQLSetConnectAttr") != 0)
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLExecDirect RetCode[%d]\n", RetCode);
RetCode = SQLDriverConnect(m_hdbc, NULL, (SQLTCHAR*)wszConnStrIn, SQL_NTS, wszConnStrOut, _countof(wszConnStrOut), (SQLSMALLINT *)&cbConnStrOutMax, SQL_DRIVER_NOPROMPT);
if (RetCode == SQL_SUCCESS || RetCode == SQL_SUCCESS_WITH_INFO){
RetCode = SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, &m_hstmt);
if (CheckRetCode(RetCode, L"SQLAllocHandle") == 0){
swprintf(wszQuery, L"use %s", pwszDBName);
RetCode = SQLExecDirect(m_hstmt, wszQuery, SQL_NTS);
if (RetCode == SQL_SUCCESS || RetCode == SQL_SUCCESS_WITH_INFO)
{
memcpy(m_szIp, pIp, sizeof(m_szIp));
m_nPort = nPort;
memcpy(m_wszDBName, pwszDBName, sizeof(m_wszDBName));
memcpy(m_wszID, pwszID, sizeof(m_wszID));
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L">> [T:%d, WorldID:%d] %S:%d:%s\r\n", m_cThreadID, m_nWorldSetID, pIp, nPort, pwszDBName);
return ERROR_NONE;
}
else
{
CheckRetCode(RetCode, L"SQLExecDirect");
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLExecDirect RetCode[%d]\n", RetCode);
}
}
else
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLAllocHandle2 RetCode[%d]\n", RetCode);
}
else
#if defined(PRE_FIX_SQLCONNECTFAIL_LOG)
DisplaySQLConnectError();
#else // #if defined(PRE_FIX_SQLCONNECTFAIL_LOG)
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLDriverConnect RetCode[%d]\n", RetCode);
#endif // #if defined(PRE_FIX_SQLCONNECTFAIL_LOG)
}
else
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLAllocHandle1 RetCode[%d]\n", RetCode);
}
else
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLSetEnvAttr RetCode[%d]\n", RetCode);
}
else
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"DBConnect Error SQLAllocHandle0 RetCode[%d]\n", RetCode);
Disconnect();
return ERROR_DB;
}
void CSQLConnection::Disconnect()
{
if (m_hstmt){
SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);
m_hstmt = 0;
}
if (m_hdbc){
SQLDisconnect (m_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, m_hdbc);
m_hdbc = 0;
}
if (m_henv){
SQLFreeHandle(SQL_HANDLE_ENV, m_henv);
m_henv = 0;
}
}
int CSQLConnection::CheckRetCode(SQLRETURN RetCode, WCHAR *pDesc)
{
if (SQL_SUCCEEDED(RetCode) || RetCode == SQL_NEED_DATA || RetCode == SQL_NO_DATA){
return ERROR_NONE;
}
DisplayInfo (RetCode, pDesc);
return ERROR_DB;
}
#if defined(PRE_FIX_SQLCONNECTFAIL_LOG)
int CSQLConnection::DisplaySQLConnectError()
{
SQLINTEGER Error;
SQLSMALLINT MsgLen;
WCHAR InfoMsg[10] = { 0, }, ErrorMsg[1025] = { 0, }, SqlState[10] = { 0, };
_wcscpy(InfoMsg, _countof(InfoMsg), L"SQLError", (int)wcslen(L"SQLError"));
SQLRETURN sqlReturn = SQLGetDiagRec(SQL_HANDLE_DBC, m_hdbc, 1, SqlState, &Error, ErrorMsg, 1024, &MsgLen);
if (sqlReturn == SQL_SUCCESS)
g_Log.Log(LogType::_DBSYSTEM_ERROR, m_nWorldSetID, 0, 0, 0, L"SQLError #SQLDriveConnect# (%s) %ld, %s\r\n", SqlState, Error, ErrorMsg);
else
g_Log.Log(LogType::_DBSYSTEM_ERROR, m_nWorldSetID, 0, 0, 0, L"SQLError #SQLDriveConnect# (%s) unknown (%d)\r\n", SqlState, sqlReturn);
return ERROR_DB;
}
#endif // #if defined(PRE_FIX_SQLCONNECTFAIL_LOG)
void CSQLConnection::DisplayInfo(SQLRETURN RetCode, WCHAR *pDesc)
{
SQLINTEGER Error;
SQLSMALLINT MsgLen;
WCHAR InfoMsg[10] = { 0, }, ErrorMsg[1025] = { 0, }, SqlState[10] = { 0, };
if (SQL_SUCCEEDED(RetCode))
_wcscpy(InfoMsg, _countof(InfoMsg), L"SQLInfo", (int)wcslen(L"SQLInfo"));
else
_wcscpy(InfoMsg, _countof(InfoMsg), L"SQLError", (int)wcslen(L"SQLError"));
SQLRETURN sqlReturn = SQLGetDiagRec(SQL_HANDLE_STMT, m_hstmt, 1, SqlState, &Error, ErrorMsg, 1024, &MsgLen);
if (sqlReturn == SQL_SUCCESS)
{
if (Error == 2601) return;
g_Log.Log(LogType::_DBSYSTEM_ERROR, L"%s: #%s# (%s) %ld, %s\r\n", InfoMsg, pDesc, SqlState, Error, ErrorMsg);
g_Log.Log(LogType::_DBSYSTEM_ERROR, L"Query:%s\r\n", m_wszQuery );
if (Error == WSAECONNRESET ||
wcscmp(SqlState, L"08S01") == 0 || // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wcscmp(SqlState, L"24000") == 0) // <20>߸<EFBFBD><DFB8><EFBFBD> Ŀ<><C4BF> <20><><EFBFBD><EFBFBD>
{
Disconnect(); // <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><EFBFBD><E7BFAC>
}
}
else
{
g_Log.Log(LogType::_DBSYSTEM_ERROR, L"%s: #%s# (%s) unknown (%d)\r\n", InfoMsg, pDesc, SqlState, sqlReturn);
}
}
int CSQLConnection::CheckConnect()
{
if (m_hstmt == 0) return Reconnect(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD> <20><EFBFBD><E7BFAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ERROR_NONE;
}
int CSQLConnection::Reconnect()
{
int nResult = Connect(m_szIp, m_nPort, m_wszDBName, m_wszID);
if (nResult < 0)
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, 0, 0, 0, L"SQL Reconnect Error~! (T:%d W:%d (%S:%d) DBName:%s)\r\n", m_cThreadID, m_nWorldSetID, m_szIp, m_nPort, m_wszDBName);
return nResult;
}
int CSQLConnection::CommonRowcountQuery(WCHAR *pQuery)
{
if (CheckConnect() < 0){
g_Log.Log(LogType::_ERROR, L"[CommonRowcountQuery] Check Connect Fail\r\n");
return ERROR_DB;
}
SQLRETURN RetCode;
SQLLEN cblen;
int nResult = 0;
RetCode = SQLPrepare (m_hstmt, pQuery, SQL_NTSL);
if (CheckRetCode(RetCode, L"SQLPrepare") == ERROR_NONE){
RetCode = SQLBindParameter (m_hstmt, 1, SQL_PARAM_OUTPUT, SQL_INTEGER, SQL_INTEGER, sizeof(int), 0, &nResult, sizeof(int), &cblen); // @@rowcount <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
RetCode = SQLExecute (m_hstmt);
if (CheckRetCode(RetCode, L"SQLExecute") == ERROR_NONE)
{
if (nResult == ERROR_NONE_ROWCOUNT) return ERROR_NONE; // <20><><EFBFBD><EFBFBD>
// return ERROR_NONE;
return nResult;
}
}
return ERROR_DB;
}
int CSQLConnection::CommonResultQuery(WCHAR *pQuery)
{
if (CheckConnect() < 0){
g_Log.Log(LogType::_ERROR, L"[CommonResultQuery] Check Connect Fail\r\n");
return ERROR_DB;
}
SQLRETURN RetCode;
SQLLEN cblen;
int nResult = 0;
RetCode = SQLPrepare (m_hstmt, pQuery, SQL_NTSL);
if (CheckRetCode(RetCode, L"SQLPrepare") == ERROR_NONE){
RetCode = SQLBindParameter (m_hstmt, 1, SQL_PARAM_OUTPUT, SQL_INTEGER, SQL_INTEGER, sizeof(int), 0, &nResult, sizeof(int), &cblen); // return<72><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
RetCode = SQLExecute (m_hstmt);
if (CheckRetCode(RetCode, L"SQLExecute") == ERROR_NONE){
// if (nResult == 0) return ERROR_DB;
return nResult;
}
}
return ERROR_DB;
}
int CSQLConnection::CommonReturnValueQuery(WCHAR *pQuery)
{
if (CheckConnect() < 0){
g_Log.Log(LogType::_ERROR, L"[CommonReturnValueQuery] CheckConnect Fail\r\n");
return ERROR_DB;
}
SQLRETURN RetCode;
SQLLEN cblen;
int nResult = ERROR_DB;
RetCode = SQLPrepare (m_hstmt, pQuery, SQL_NTSL);
if (CheckRetCode(RetCode, L"SQLPrepare") == ERROR_NONE){
RetCode = SQLBindParameter (m_hstmt, 1, SQL_PARAM_OUTPUT, SQL_INTEGER, SQL_INTEGER, sizeof(int), 0, &nResult, sizeof(int), &cblen); // return<72><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
RetCode = SQLExecute (m_hstmt);
CheckRetCode(RetCode, L"SQLExecute");
}
return nResult;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ǥ<EFBFBD><C7A5> <20><><EFBFBD><EFBFBD><EEB0A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ǥ <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ <20>ΰ<EFBFBD><CEB0><EFBFBD> <20>ٲ<EFBFBD><D9B2>ִ<EFBFBD> <20>Լ<EFBFBD>
void CSQLConnection::ConvertQuery(WCHAR *pSrc, int nSrcMaxSize, WCHAR *pResultStr, int nDesMaxSize)
{
if( nSrcMaxSize * 2 + 1 > nDesMaxSize )
{
g_Log.Log(LogType::_ERROR, 0, 0, 0, 0, L"ConvertQuery MaxSize Error\r\n");
return;
}
int nLen = (int)wcslen(pSrc);
if (nSrcMaxSize < nLen) nLen = nSrcMaxSize;
int j = 0;
for (int i = 0; i < nLen; i++){
if (pSrc[i] == '\'')
{
pResultStr[j] = pSrc[i];
j++;
pResultStr[j] = pSrc[i];
}
else
{
pResultStr[j] = pSrc[i];
}
j++;
}
if( j >= nDesMaxSize)
{
j -= 1;
}
pResultStr[j] = NULL;
}
void CSQLConnection::CheckColumnCount(int nBindCount, const char* pszQuery)
{
SQLSMALLINT nColCount = 0;
SQLRETURN RetCode;
RetCode = SQLNumResultCols(m_hstmt, &nColCount);
if (CheckRetCode(RetCode, L"SQLNumResultCols") == ERROR_NONE)
{
if( nBindCount-1 != nColCount )
g_Log.Log(LogType::_ERROR, L"[%S] BindCount:%d, ResultCount:%d\r\n", pszQuery, nBindCount, nColCount);
}
}
#if defined(PRE_ADD_SQL_RENEW)
CSQLRecordSet::CSQLRecordSet(CSQLConnection* pConnection)
: m_pConnection(pConnection), m_bFetch(false), m_nBindCount(1)
{
if ( m_pConnection && m_pConnection->CheckConnect() < 0){
//g_Log.Log(LogType::_ERROR, L"[CommonReturnValueQuery] CheckConnect Fail\r\n");
}
if( m_pConnection )
m_hstmt = m_pConnection->GetStmt();
}
CSQLRecordSet::~CSQLRecordSet()
{
m_vBindParam.clear();
if( m_bFetch )
SQLCloseCursor(m_hstmt);
}
void CSQLRecordSet::AddParamBit(SQLSMALLINT type, SQLPOINTER pValue, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_BIT, SQL_BIT, sizeof(bool), pValue, bInputNull));
}
void CSQLRecordSet::AddParamByte(SQLSMALLINT type, SQLPOINTER pValue, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_TINYINT, SQL_TINYINT, sizeof(BYTE), pValue, bInputNull));
}
void CSQLRecordSet::AddParamShort(SQLSMALLINT type, SQLPOINTER pValue, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_SSHORT, SQL_SMALLINT, sizeof(short), pValue, bInputNull));
}
void CSQLRecordSet::AddParamInt(SQLSMALLINT type, SQLPOINTER pValue, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_SLONG, SQL_INTEGER, sizeof(int), pValue, bInputNull));
}
void CSQLRecordSet::AddParamInt64(SQLSMALLINT type, SQLPOINTER pValue, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_SBIGINT, SQL_BIGINT, sizeof(INT64), pValue, bInputNull));
}
void CSQLRecordSet::AddParamTimeStamp(SQLSMALLINT type, SQLPOINTER pValue, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_TIMESTAMP, SQL_TIMESTAMP, sizeof(TIMESTAMP_STRUCT), pValue, bInputNull));
}
void CSQLRecordSet::AddParamString(SQLSMALLINT type, SQLPOINTER pValue, int nSize, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_CHAR, SQL_VARCHAR, nSize, pValue, bInputNull));
}
void CSQLRecordSet::AddParamWString(SQLSMALLINT type, SQLPOINTER pValue, int nSize, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_WCHAR, SQL_WVARCHAR, nSize, pValue, bInputNull));
}
void CSQLRecordSet::AddParamBinary(SQLSMALLINT type, SQLPOINTER pValue, int nSize, bool bInputNull)
{
m_vBindParam.push_back(CParamODBC(type, SQL_C_BINARY, SQL_BINARY, nSize, pValue, bInputNull));
}
void CSQLRecordSet::AddBindColBit(SQLPOINTER pValue)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_BIT, pValue, sizeof(bool), &cblen);
}
void CSQLRecordSet::AddBindColByte(SQLPOINTER pValue)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_TINYINT, pValue, sizeof(BYTE), &cblen);
}
void CSQLRecordSet::AddBindColShort(SQLPOINTER pValue)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_SMALLINT, pValue, sizeof(short), &cblen);
}
void CSQLRecordSet::AddBindColInt(SQLPOINTER pValue)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_INTEGER, pValue, sizeof(INT), &cblen);
}
void CSQLRecordSet::AddBindColInt64(SQLPOINTER pValue)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_C_SBIGINT, pValue, sizeof(INT64), &cblen);
}
void CSQLRecordSet::AddBindColTimeStamp(SQLPOINTER pValue)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_TIMESTAMP, pValue, sizeof(TIMESTAMP_STRUCT), &cblen);
}
void CSQLRecordSet::AddBindColString(SQLPOINTER pValue, int nSize)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_CHAR, pValue, nSize, &cblen);
}
void CSQLRecordSet::AddBindColWString(SQLPOINTER pValue, int nSize)
{
SQLLEN cblen;
SQLBindCol(m_pConnection->GetStmt(), m_nBindCount++, SQL_WCHAR, pValue, nSize, &cblen);
}
bool CSQLRecordSet::Execute(const WCHAR* strQuery)
{
if( !m_pConnection || m_pConnection->GetStmt() == 0)
return false;
SQLRETURN RetCode;
RetCode = SQLExecDirect(m_hstmt, (SQLTCHAR*)strQuery, SQL_NTS);
if( m_pConnection->CheckRetCode( RetCode, L"SQLExecDirect" ) != ERROR_NONE )
return false;
return true;
}
bool CSQLRecordSet::Execute_Procedure(const WCHAR* strProcName, bool bReturn)
{
if( !m_pConnection || m_pConnection->GetStmt() == 0)
return false;
WCHAR strQuery[4096];
SQLRETURN RetCode;
int nCount = 1;
if (!m_vBindParam.empty())
{
BIND_PARAM_ARRAY_IT it;
for (it = m_vBindParam.begin(); it != m_vBindParam.end(); it++)
{
if((*it).m_bNull)
(*it).m_StrLenIndPtr = SQL_NULL_DATA;
else if( (*it).m_sValueType == SQL_C_CHAR)
(*it).m_StrLenIndPtr = SQL_NTS;
else if( (*it).m_sValueType == SQL_C_WCHAR)
(*it).m_StrLenIndPtr = SQL_NTSL;
RetCode = SQLBindParameter(m_hstmt, nCount++, (*it).m_sType, (*it).m_sValueType,
(*it).m_sParamType, (*it).m_unColumnSize, 0, (*it).m_pValue, 0, &(*it).m_StrLenIndPtr);
if (RetCode != SQL_SUCCESS && RetCode != SQL_SUCCESS_WITH_INFO)
return false;
if (it == m_vBindParam.begin())
{
if (bReturn)
swprintf(strQuery,4095, L"{ ? = CALL %s(", strProcName);
else
swprintf(strQuery,4095, L"{ CALL %s(?, ", strProcName);
}
else
wcscat(strQuery, _T("?, "));
}
if (strQuery[wcslen(strQuery) - 2] == L',')
wcscpy(&strQuery[wcslen(strQuery) - 2], L") }");
else
wcscat(strQuery, _T(") }"));
}
else
swprintf(strQuery, 4095, L"{ CALL %s() }", strProcName);
RetCode = SQLPrepare( m_hstmt, strQuery, SQL_NTSL );
if( m_pConnection->CheckRetCode( RetCode, L"SQLPrepare" ) == ERROR_NONE )
{
RetCode = SQLExecute( m_hstmt );
if( m_pConnection->CheckRetCode( RetCode, L"SQLExecute" ) != ERROR_NONE )
return false;
}
return true;
}
bool CSQLRecordSet::Fetch()
{
SQLRETURN RetCode;
RetCode = SQLFetch(m_pConnection->GetStmt());
if( m_pConnection->CheckRetCode( RetCode, L"SQLFetch" ) != ERROR_NONE || RetCode == SQL_NO_DATA )
return false;
m_bFetch = true;
return true;
}
#endif //#if defined(PRE_ADD_SQL_RENEW)