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

模拟服务器

开发平台:

C/C++

  1. // S3P_MSSQLServer_Result.cpp: implementation of the S3P_MSSQLServer_Result class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "S3P_MSSQLServer_Result.h"
  5. #include <stdio.h>
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. S3P_MSSQLServer_Result::~S3P_MSSQLServer_Result()
  10. {
  11. m_pResult = NULL;
  12. assert(m_nAddRef == 0);
  13. }
  14. int S3P_MSSQLServer_Result::num_rows() const
  15. {
  16. int iRet = 0;
  17. try
  18. {
  19. if (m_pResult)
  20. iRet = m_pResult->GetRecordCount();
  21. }
  22. catch( _com_error e )
  23. {
  24. //printf("[S3P_MSSQLServer_Result::num_rows]COM error: %srn", e.ErrorMessage());
  25. }
  26. return iRet;
  27. }
  28. int S3P_MSSQLServer_Result::num_fields() const
  29. {
  30. int iRet = 0;
  31. try
  32. {
  33. if (m_pResult)
  34. {
  35. FieldsPtr pFs = m_pResult->GetFields();
  36. iRet = pFs->GetCount();
  37. }
  38. }
  39. catch( _com_error e )
  40. {
  41. //printf("[S3P_MSSQLServer_Result::num_fields]COM error: %srn", e.ErrorMessage());
  42. }
  43. return iRet;
  44. }
  45. void S3P_MSSQLServer_Result::data_seek(unsigned int offset, int nType) const
  46. {
  47. try
  48. {
  49. if (NULL != m_pResult)
  50. {
  51. unsigned int iRows = num_rows();
  52. if (nType == begin)
  53. {
  54. m_pResult->MoveFirst();
  55. if (offset > 0 && offset < iRows)
  56. {
  57. m_pResult->Move(offset);
  58. }
  59. }
  60. else if (nType == end)
  61. {
  62. m_pResult->MoveLast();
  63. }
  64. else if (nType == next)
  65. {
  66. for (;offset > 0; offset--)
  67. m_pResult->MoveNext();
  68. }
  69. else if (nType == previous)
  70. {
  71. for (;offset > 0; offset--)
  72. m_pResult->MovePrevious();
  73. }
  74. else
  75. assert(0);
  76. }
  77. }
  78. catch ( _com_error e )
  79. {
  80. //printf("[S3P_MSSQLServer_Result::data_seek(%d, %d)]COM error: %srn", offset, nType, e.ErrorMessage());
  81. }
  82. }
  83. bool S3P_MSSQLServer_Result::get_field_data(unsigned int nfieldindex, void* pData, unsigned long nsize)
  84. {
  85. BOOL bRet = FALSE;
  86. try
  87. {
  88. if (NULL != m_pResult && nsize == sizeof(VARIANT))
  89. {
  90. if (num_rows() > 0 && nfieldindex >= 0 && nfieldindex < num_fields())
  91. {
  92. _variant_t varIndex;
  93. varIndex = (long)nfieldindex;
  94. FieldPtr pField = m_pResult->Fields->GetItem(varIndex);
  95. if (SUCCEEDED(pField->get_Value((VARIANT*)pData)))
  96. bRet = TRUE;
  97. }
  98. }
  99. }
  100. catch ( _com_error e )
  101. {
  102. //printf("[S3P_MSSQLServer_Result::get_field_data(%d)]COM error: %srn", nfieldindex, e.ErrorMessage());
  103. }
  104. return bRet;
  105. }
  106. int S3P_MSSQLServer_Result::unuse()
  107. {
  108. if (m_pResult)
  109. {
  110. try
  111. {
  112. if (adStateOpen ==
  113. (m_pResult->GetState() & adStateOpen))
  114. {
  115. m_pResult->Close();
  116. }
  117. }
  118. catch (_com_error e)
  119. {
  120. //printf("[S3PDB_MSSQLServer_Connection::Do(1)]COM error: %srn", e.ErrorMessage());
  121. }
  122. m_nAddRef--;
  123. }
  124. return m_nAddRef;
  125. }
  126. int S3P_MSSQLServer_Result::GetResult( _Recordset** ppResult)
  127. {
  128. if (ppResult == NULL)
  129. return m_nAddRef;
  130. if (m_pResult == NULL)
  131. {
  132. HRESULT hr = m_pResult.CreateInstance("ADODB.Recordset");
  133. if (FAILED(hr))
  134. {
  135. m_pResult = NULL;
  136. }
  137. }
  138. assert(m_nAddRef == 0);
  139. if (m_nAddRef == 0)
  140. {
  141. *ppResult = m_pResult;
  142. if (*ppResult)
  143. m_nAddRef++;
  144. }
  145. return m_nAddRef;
  146. }