No Description

CellExecSql.cpp 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #include "StdAfx.h"
  2. #include "CellExecSql.h"
  3. #include "IvrFlow.h"
  4. #include "FlowDataProvider.h"
  5. #include "DBInterface.h"
  6. #include <boost\timer.hpp>
  7. #include <iostream>
  8. using namespace std;
  9. IMPLEMENT_CELL_AUTOCREATE(CCellExecSql, CELL_NAME_SQL)
  10. CCellExecSql::CCellExecSql(void)
  11. {
  12. m_IsSaveRs = 0;
  13. m_SuccessPos = 0;
  14. m_FailPos = 0;
  15. m_Sql = "";
  16. m_Connect = "";
  17. }
  18. CCellExecSql::CCellExecSql(CCellExecSql & cellExeSql) : CCellBase(cellExeSql)
  19. {
  20. m_IsSaveRs = cellExeSql.m_IsSaveRs;
  21. m_Connect = cellExeSql.m_Connect;
  22. m_SuccessPos = cellExeSql.m_SuccessPos;
  23. m_FailPos = cellExeSql.m_FailPos;
  24. m_Sql = cellExeSql.m_Sql;
  25. }
  26. CCellExecSql::~CCellExecSql(void)
  27. {
  28. }
  29. /*****************************************************************
  30. **【函数名称】 Operate
  31. **【函数功能】 节点执行函数
  32. **【参数】
  33. **【返回值】 下一个节点编号
  34. ****************************************************************/
  35. int CCellExecSql::operate(void)
  36. {
  37. if (m_pIvrFlow == NULL)
  38. return CELL_OP_ERROR;
  39. CString Info;
  40. _getCellInfo(Info);
  41. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  42. CString SQL;
  43. // 替换SQL语句中的变量
  44. if (!m_pIvrFlow->replaceVar(m_Sql, SQL))
  45. {
  46. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换SQL语句中变量失败, SQL = %s"), Info, SQL);
  47. return m_FailPos;
  48. }
  49. // 初始化数据库
  50. CString strErrMessage = _T("");
  51. CDBInterface* pTmpDB = new CDBInterface(); // 成生一个临时数据库对象
  52. if (!pTmpDB->Init(strErrMessage))
  53. {
  54. delete pTmpDB;
  55. pTmpDB = NULL;
  56. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 初始化数据库对象失败, Error = %s"), Info, strErrMessage);
  57. return m_FailPos;
  58. } // end if
  59. DataSet& RS = m_pIvrFlow->recordSet();
  60. RS.RemoveAll();
  61. int nRet = CELL_OP_ERROR; // 执行的返回值
  62. boost::timer t; // 2022-05-30 计算sql执行时间
  63. // 连接数据库
  64. if (pTmpDB->ConnectDataBase(m_Connect, strErrMessage))
  65. {
  66. // 执行SQL语句
  67. bool bResult = false;
  68. _RecordsetPtr pTmpRD = pTmpDB->SqlRecordset(SQL, bResult, strErrMessage);
  69. if (bResult)
  70. {
  71. if (m_IsSaveRs) // 需要结果集
  72. {
  73. if (!pTmpRD->adoEOF) //有记录集
  74. {
  75. nRet = m_SuccessPos;
  76. // 获取结果集的列数
  77. FieldsPtr fields = pTmpRD->GetFields();
  78. VARIANT varIndex;
  79. VariantInit(&varIndex);
  80. varIndex.vt = VT_I2;
  81. int nFields = fields->GetCount();
  82. // 将结果集的值存入链表
  83. for (int i = 0; i < nFields; ++i)
  84. {
  85. varIndex.iVal = (SHORT)i;
  86. FieldPtr field = fields->Item[varIndex];
  87. _bstr_t FieldName = field->GetName();
  88. CString strColumName = (char*)FieldName; //字段名称
  89. //从记录集读取字段
  90. _variant_t VarValue = pTmpRD->GetCollect(FieldName);
  91. CString strValue;
  92. //判断读取字段值的有效性
  93. if (VarValue.vt == VT_ERROR || VarValue.vt == VT_EMPTY || VarValue.vt == VT_NULL)
  94. {
  95. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 读取字段[%s]失败, 该字段值可能为空"), Info, strColumName);
  96. strValue = "";
  97. RS.AddTail("");
  98. }
  99. else
  100. {
  101. strValue = (char *)_bstr_t(VarValue);
  102. RS.AddTail(strValue);
  103. }
  104. } // end for
  105. // 日志
  106. // ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, SQL = %s, 数据库中查到记录"), Info, m_Sql);
  107. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]时间[%lf]结束, SQL = %s, 数据库中查到记录"), Info, t.elapsed(), m_Sql);
  108. t.elapsed();
  109. }
  110. else//空记录集
  111. {
  112. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, SQL = %s, 数据库中无记录"), Info, m_Sql);
  113. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]时间[%lf]结束, SQL = %s, 数据库中无记录"), Info, t.elapsed(), m_Sql);
  114. cout << "数据库无记录" << SQL;
  115. nRet = m_FailPos;
  116. }
  117. }
  118. else //不需要记录集
  119. {
  120. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, SQL = %s"), Info, m_Sql);
  121. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]时间[%lf]结束, SQL = %s"), Info, t.elapsed(), m_Sql);
  122. nRet = m_FailPos;
  123. }
  124. }
  125. else
  126. {
  127. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]失败, SQL = %s, Error = %s"), Info, m_Sql, strErrMessage);
  128. /*2022-03-30 如果执行失败暂停1秒再次执行*/
  129. if (SQL.Find("update") >= 0)
  130. {
  131. Sleep(1000);
  132. strErrMessage = "";
  133. pTmpDB->SqlRecordset(SQL, bResult, strErrMessage);
  134. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 重新执行[%s]%s, SQL = %s, Error = %s"), Info, bResult ? "成功" : "失败", m_Sql, strErrMessage);
  135. }
  136. nRet = m_FailPos;
  137. }
  138. }
  139. else
  140. {
  141. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 连接数据库失败, Error = %s"), Info, strErrMessage);
  142. nRet = m_FailPos;
  143. } // end if
  144. // 释放数据库对象
  145. pTmpDB->CloseConn();
  146. delete pTmpDB;
  147. pTmpDB = NULL;
  148. // 返回执行结果
  149. return nRet;
  150. }
  151. /*****************************************************************
  152. **【函数名称】 copy
  153. **【函数功能】 拷贝自身
  154. **【参数】
  155. **【返回值】 拷贝副本
  156. ****************************************************************/
  157. CCellBase * CCellExecSql::copy(void)
  158. {
  159. CCellBase *pCellBase = new CCellExecSql(*this);
  160. return pCellBase;
  161. }
  162. /*****************************************************************
  163. **【函数名称】 fillData
  164. **【函数功能】 节点解析,填充数据
  165. **【参数】 Provider:数据提供器
  166. **【返回值】 成功true,失败false
  167. ****************************************************************/
  168. bool CCellExecSql::fillData(IFlowDataProvider& Provider)
  169. {
  170. CString Data;
  171. do
  172. {
  173. if (!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  174. {
  175. Data = _T("节点号");
  176. break;
  177. }
  178. else
  179. {
  180. sscanf_s(Data, _T("%d"), &m_Pos);
  181. if (m_Pos < 1)
  182. {
  183. Data = _T("节点号");
  184. break;
  185. }
  186. }
  187. if (!Provider.getData(CELL_ATTRIBUTE_CONN_STR, m_Connect))
  188. {
  189. Data = _T("连接字符串");
  190. break;
  191. }
  192. if (!Provider.getData(CELL_ATTRIBUTE_SQL_STR, m_Sql))
  193. {
  194. Data = _T("SQL语句");
  195. break;
  196. }
  197. if (!Provider.getData(CELL_ATTRIBUTE_SAVE_FLAG, Data))
  198. {
  199. Data = _T("保存标志");
  200. break;
  201. }
  202. else
  203. {
  204. if (Data == DATA_BOOL_YES)
  205. m_IsSaveRs = true;
  206. else
  207. m_IsSaveRs = false;
  208. }
  209. if (!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  210. {
  211. Data = _T("成功跳转节点");
  212. break;
  213. }
  214. else
  215. {
  216. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  217. if (m_SuccessPos < 0)
  218. {
  219. Data = _T("成功跳转节点");
  220. break;
  221. }
  222. }
  223. if (!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  224. {
  225. Data = _T("失败跳转节点");
  226. break;
  227. }
  228. else
  229. {
  230. sscanf_s(Data, _T("%d"), &m_FailPos);
  231. if (m_FailPos < 0)
  232. {
  233. Data = _T("失败跳转节点");
  234. break;
  235. }
  236. }
  237. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  238. return true;
  239. } while (false);
  240. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_SQL, Data);
  241. return false;
  242. }