#include "StdAfx.h" #include "CellExecSql.h" #include "IvrFlow.h" #include "FlowDataProvider.h" #include "DBInterface.h" IMPLEMENT_CELL_AUTOCREATE(CCellExecSql, CELL_NAME_SQL) CCellExecSql::CCellExecSql(void) { m_IsSaveRs = 0; m_SuccessPos = 0; m_FailPos = 0; m_Sql = ""; m_Connect = ""; } CCellExecSql::CCellExecSql( CCellExecSql & cellExeSql ) : CCellBase(cellExeSql) { m_IsSaveRs = cellExeSql.m_IsSaveRs; m_Connect = cellExeSql.m_Connect; m_SuccessPos = cellExeSql.m_SuccessPos; m_FailPos = cellExeSql.m_FailPos; m_Sql = cellExeSql.m_Sql; } CCellExecSql::~CCellExecSql(void) { } /***************************************************************** **【函数名称】 Operate **【函数功能】 节点执行函数 **【参数】 **【返回值】 下一个节点编号 ****************************************************************/ int CCellExecSql::operate( void ) { if(m_pIvrFlow == NULL) return CELL_OP_ERROR; CString Info; _getCellInfo(Info); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info); CString SQL; // 替换SQL语句中的变量 if(!m_pIvrFlow->replaceVar(m_Sql, SQL)) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换SQL语句中变量失败, SQL = %s"), Info, SQL); return m_FailPos; } // 初始化数据库 CString strErrMessage = _T(""); CDBInterface* pTmpDB = new CDBInterface(); // 成生一个临时数据库对象 if( !pTmpDB->Init(strErrMessage)) { delete pTmpDB; ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 初始化数据库对象失败, Error = %s"), Info, strErrMessage); return m_FailPos; } // end if DataSet& RS = m_pIvrFlow->recordSet(); RS.RemoveAll(); int nRet = CELL_OP_ERROR; // 执行的返回值 // 连接数据库 if(pTmpDB->ConnectDataBase(m_Connect, strErrMessage)) { // 执行SQL语句 bool bResult = false; _RecordsetPtr pTmpRD = pTmpDB->SqlRecordset(SQL, bResult, strErrMessage); if(bResult) { if(m_IsSaveRs) // 需要结果集 { if(!pTmpRD->adoEOF) //有记录集 { nRet = m_SuccessPos; // 获取结果集的列数 FieldsPtr fields = pTmpRD->GetFields(); VARIANT varIndex; VariantInit(&varIndex); varIndex.vt = VT_I2; int nFields = fields->GetCount(); // 将结果集的值存入链表 for( int i = 0; i < nFields; ++i ) { varIndex.iVal = (SHORT)i; FieldPtr field = fields->Item[varIndex]; _bstr_t FieldName = field->GetName(); CString strColumName = (char*)FieldName; //字段名称 //从记录集读取字段 _variant_t VarValue = pTmpRD->GetCollect(FieldName); CString strValue; //判断读取字段值的有效性 if (VarValue.vt == VT_ERROR || VarValue.vt == VT_EMPTY || VarValue.vt == VT_NULL) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 读取字段[%s]失败, 该字段值可能为空"), Info, strColumName); strValue = ""; RS.AddTail(""); } else { strValue = (char *)_bstr_t( VarValue ); RS.AddTail(strValue); } } // end for // 日志 ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, SQL = %s, 数据库中查到记录"), Info, m_Sql); } else//空记录集 { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, SQL = %s, 数据库中无记录"), Info, m_Sql); nRet = m_FailPos; } } else //不需要记录集 { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, SQL = %s"), Info, m_Sql); nRet = m_FailPos; } } else { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]失败, SQL = %s"), Info, m_Sql); nRet = m_FailPos; } } else { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 连接数据库失败, Error = %s"), Info, strErrMessage); nRet = m_FailPos; } // end if // 释放数据库对象 pTmpDB->CloseConn(); delete pTmpDB; pTmpDB = NULL; // 返回执行结果 return nRet; } /***************************************************************** **【函数名称】 copy **【函数功能】 拷贝自身 **【参数】 **【返回值】 拷贝副本 ****************************************************************/ CCellBase * CCellExecSql::copy( void ) { CCellBase *pCellBase = new CCellExecSql(*this); return pCellBase; } /***************************************************************** **【函数名称】 fillData **【函数功能】 节点解析,填充数据 **【参数】 Provider:数据提供器 **【返回值】 成功true,失败false ****************************************************************/ bool CCellExecSql::fillData( IFlowDataProvider& Provider ) { CString Data; do { if(!Provider.getData(CELL_ATTRIBUTE_POS, Data)) { Data = _T("节点号"); break; } else { sscanf_s(Data, _T("%d"), &m_Pos); if(m_Pos < 1) { Data = _T("节点号"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_CONN_STR, m_Connect)) { Data = _T("连接字符串"); break; } if(!Provider.getData(CELL_ATTRIBUTE_SQL_STR, m_Sql)) { Data = _T("SQL语句"); break; } if(!Provider.getData(CELL_ATTRIBUTE_SAVE_FLAG, Data)) { Data = _T("保存标志"); break; } else { if(Data == DATA_BOOL_YES) m_IsSaveRs = true; else m_IsSaveRs = false; } if(!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data)) { Data = _T("成功跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_SuccessPos); if(m_SuccessPos < 0) { Data = _T("成功跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data)) { Data = _T("失败跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_FailPos); if(m_FailPos < 0) { Data = _T("失败跳转节点"); break; } } Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note); return true; } while (false); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_SQL, Data); return false; }