S3PDB_MSSQLServer_Connection.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // S3PDB_MSSQLServer_Connection.cpp: implementation of the S3PDB_MSSQLServer_Connection class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "S3PDB_MSSQLServer_Connection.h"
  5. #include "S3P_MSSQLServer_Result.h"
  6. #include "GlobalFun.h"
  7. WINOLEAPI  CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
  8. //////////////////////////////////////////////////////////////////////
  9. // Construction/Destruction
  10. //////////////////////////////////////////////////////////////////////
  11. static int nSQLServer = 0;
  12. S3PDB_MSSQLServer_Connection::S3PDB_MSSQLServer_Connection()
  13. : m_pCon(NULL), m_pCmd(NULL)
  14. {
  15. if (nSQLServer == 0)
  16. CoInitializeEx(NULL, 0);
  17. nSQLServer++;
  18. }
  19. S3PDB_MSSQLServer_Connection::~S3PDB_MSSQLServer_Connection()
  20. {
  21. assert(m_pCon == NULL);
  22. nSQLServer--;
  23. if (nSQLServer == 0)
  24. CoUninitialize();
  25. }
  26. void S3PDB_MSSQLServer_Connection::CloseConnect()
  27. {
  28. if (NULL != m_pCon)
  29. {
  30. m_pCon->Close();
  31. m_pCon = NULL;
  32. }
  33. m_pCmd = NULL;
  34. }
  35. bool S3PDB_MSSQLServer_Connection::OpenConnect(_LPDATABASEINFO lpDBIdentifier)
  36. {
  37. assert(lpDBIdentifier);
  38. assert(NULL == m_pCon);
  39. bool bRet = true;
  40. if (NULL == m_pCon)
  41. {
  42. bRet = false;
  43. _ConnectionPtr pCon;
  44. HRESULT hr = pCon.CreateInstance("ADODB.Connection");
  45. if ((SUCCEEDED(hr))
  46. && (NULL != pCon))
  47. {
  48. std::string strSource = "driver={SQL Server};";
  49. std::string strTemp = "Server=";
  50. strTemp += lpDBIdentifier->strServer;
  51. strTemp += ";";
  52. strSource += strTemp;
  53. strTemp = "Database=";
  54. strTemp += lpDBIdentifier->strDataBase;
  55. strTemp += ";";
  56. strSource += strTemp;
  57. lpDBIdentifier->strDataBase.c_str();
  58. try
  59. {
  60. pCon->CursorLocation = adUseClient;
  61. hr = pCon->Open(strSource.c_str(),
  62. lpDBIdentifier->strUser.c_str(),
  63. lpDBIdentifier->strPassword.c_str(),
  64. adConnectUnspecified);
  65. if (SUCCEEDED(hr))
  66. {
  67. m_pCon = pCon;
  68. m_pCmd.CreateInstance("ADODB.Command");
  69. if (m_pCmd)
  70. m_pCmd->ActiveConnection = m_pCon;
  71. bRet = true;
  72. }
  73. }
  74. catch( _com_error &e )
  75. {
  76. gTrace("[S3PDBConnectionPool::OpenConnect]COM error: %s", e.ErrorMessage());
  77. }
  78. }
  79. }
  80. return bRet;
  81. }
  82. bool S3PDB_MSSQLServer_Connection::Do(const char* lpszSql)
  83. {
  84. BOOL bRet = false;
  85. if (m_pCon == NULL)
  86. return bRet;
  87. try
  88. {
  89. if (m_pCmd)
  90. {
  91. m_pCmd->CommandText = lpszSql;
  92. m_pCmd->Execute(NULL, NULL, adCmdText);
  93. bRet = TRUE;
  94. }
  95. else
  96. {
  97. _Recordset* pRes = NULL;
  98. S3PResultVBC* pResult = NULL;
  99. if (GetFreeResult(&pResult, &pRes))
  100. {
  101. if (pRes)
  102. {
  103. try
  104. {
  105. HRESULT hr =
  106. pRes->Open(lpszSql,
  107. _variant_t( (IDispatch*)(m_pCon), true),
  108. adOpenDynamic,
  109. adLockOptimistic,
  110. adCmdText);
  111. if (SUCCEEDED(hr))
  112. {
  113. bRet = TRUE;
  114. }
  115. }
  116. catch (_com_error &e)
  117. {
  118. gTrace("[S3PDB_MSSQLServer_Connection::Do COM error: %s", e.ErrorMessage());
  119. }
  120. }
  121. pResult->unuse();
  122. }
  123. }
  124. }
  125. catch (_com_error &e)
  126.     {
  127. gTrace("[S3PDB_MSSQLServer_Connection::Do COM error: %s", e.ErrorMessage());
  128.     }
  129. return bRet;
  130. }
  131. bool S3PDB_MSSQLServer_Connection::DoSql(const char* lpszSql, _Recordset* pRes)
  132. {
  133. BOOL bRet = false;
  134. if ((NULL != m_pCon) &&
  135. (NULL != lpszSql) &&
  136. (NULL != pRes))
  137. {
  138. try
  139. {
  140. HRESULT hr =
  141. pRes->Open(lpszSql,
  142. _variant_t( (IDispatch*)(m_pCon), true),
  143. adOpenStatic,
  144. adLockReadOnly,
  145. adCmdText);
  146. if (SUCCEEDED(hr))
  147. {
  148. bRet = TRUE;
  149. }
  150. }
  151. catch ( _com_error &e )
  152. {
  153. #ifdef _DEBUG
  154. gTrace("SQL Error: %s", lpszSql);
  155. #endif
  156. gTrace("[S3PDB_MSSQLServer_Connection::DoSql COM error: %s", e.ErrorMessage());
  157. bRet = FALSE;
  158. }
  159. }
  160. return bRet;
  161. }
  162. bool S3PDB_MSSQLServer_Connection::QuerySql(const char* lpszSql, S3PResultVBC** ppResult)
  163. {
  164. *ppResult = NULL;
  165. BOOL bRet = FALSE;
  166. _Recordset* pRes = NULL;
  167. S3PResultVBC* pResult = NULL;
  168. if (GetFreeResult(&pResult, &pRes))
  169. {
  170. if (pRes)
  171. {
  172. bRet = DoSql(lpszSql, pRes);
  173. }
  174. if (bRet)
  175. {
  176. *ppResult = pResult;
  177. }
  178. else
  179. {
  180. pResult->unuse();
  181. }
  182. }
  183. return bRet;
  184. }
  185. bool S3PDB_MSSQLServer_Connection::GetFreeResult(S3PResultVBC** ppResult, _Recordset** ppRes)
  186. {
  187. assert(ppResult && ppRes);
  188. if (m_Result.m_nAddRef == 0)
  189. {
  190. if (m_Result.GetResult(ppRes) > 0)
  191. {
  192. *ppResult = &m_Result;
  193. return true;
  194. }
  195. }
  196. if (m_Result2.m_nAddRef == 0)
  197. {
  198. if (m_Result2.GetResult(ppRes) > 0)
  199. {
  200. *ppResult = &m_Result2;
  201. return true;
  202. }
  203. }
  204. assert(0);
  205. return false;
  206. }