#include "StdAfx.h" #include "KTParamService.h" #include "KTCurveCreator.h" #include "KTExpressCalc.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define KT_PARAM_DATAFILE _T("\\KTParamPart.db") using namespace KTAcadUtl; ACRX_NO_CONS_DEFINE_MEMBERS(KTParamService, AcRxService) BOOL KTParamService::RegisterService() { // 检查是否已经注册 if (Adesk::kTrue == acrxServiceDictionary->has(KT_PARAM_SERVICE)) return TRUE; // 创建服务 KTParamService* pService = new KTParamService; if (NULL == pService) return FALSE; // 加入服务词典 BOOL bRegister = (NULL == acrxDynamicLinker->registerService(KT_PARAM_SERVICE, pService)); if (!bRegister) delete pService; // 返回状态 return bRegister; } BOOL KTParamService::RemoveService() { // 检查是否已经删除 if (Adesk::kTrue != acrxServiceDictionary->has(KT_PARAM_SERVICE)) return TRUE; // 从服务词典中移出 AcRxObject* pObject = acrxServiceDictionary->remove(KT_PARAM_SERVICE); ASSERT(NULL != pObject && pObject->isKindOf(KTParamService::desc())); // 删除服务 delete pObject; // 已经删除 return TRUE; } KTParamService::KTParamService() : m_pParamDatabase(NULL) { SetRuleHandler(_T("Line"), _T("Default"), CreateLineDefault); SetRuleHandler(_T("Line"), _T("PtAngLen"), CreateLinePtAngLen); SetRuleHandler(_T("Arc"), _T("Default"), CreateArcDefault); SetRuleHandler(_T("Arc"), _T("PtPtPt"), CreateArcPtPtPt); SetRuleHandler(_T("Arc"), _T("PtPtBulge"), CreateArcPtPtBulge); SetRuleHandler(_T("Circle"), _T("Default"), CreateCircleDefault); SetRuleHandler(_T("Circle"), _T("PtPtPt"), CreateCirclePtPtPt); SetRuleHandler(_T("Circle"), _T("Diameter"), CreateCircleDiameter); SetRuleHandler(_T("Ellipse"), _T("Default"), CreateEllipseDefault); SetRuleHandler(_T("Ellipse"), _T("PtPtRatio"), CreateEllipsePtPtRatio); SetRuleHandler(_T("Text"), _T("Default"), CreateTextDefault); SetRuleHandler(_T("Point"), _T("Default"), CreatePointDefault); SetRuleHandler(_T("Solid"), _T("Default"), CreateSolidDefault); SetRuleHandler(_T("Solid"), _T("PtPtPt"), CreateSolidPtPtPt); SetRuleHandler(_T("Cube"), _T("Default"), CreateCubeDefault); SetRuleHandler(_T("Cylinder"), _T("Default"), CreateCylinderDefault); SetRuleHandler(_T("Cone"), _T("Default"), CreateConeDefault); SetRuleHandler(_T("Torus"), _T("Default"), CreateTorusDefault); SetRuleHandler(_T("Pipe"), _T("Default"), CreatePipeDefault); SetRuleHandler(_T("Duct"), _T("Default"), CreateDuctDefault); SetRuleHandler(_T("EccPipeRed"), _T("Default"), CreateEccPipeRedDefault); SetRuleHandler(_T("PipeRed"), _T("Default"), CreatePipeRedDefault); SetRuleHandler(_T("TrCone"), _T("Default"), CreateTrConeDefault); SetRuleHandler(_T("DuctRed"), _T("Default"), CreateDuctRedDefault); SetRuleHandler(_T("HemiSph"), _T("Default"), CreateHemiSphDefault); SetRuleHandler(_T("Cap"), _T("Default"), CreateCapDefault); SetRuleHandler(_T("Tank"), _T("Default"), CreateTankDefault); } KTParamService::~KTParamService() { // 清除服务 ReleaseService(); } BOOL KTParamService::InitService() { // 检查数据库已经初始化(已经连接到数据库) if (NULL != m_pParamDatabase) return TRUE; // 取得数据库文件路径 CString sPath; if (!KTSetting::GetKTPsPath(sPath)) return FALSE; // 确定路径最后是以\结尾 if (sPath.Right(1) != _T("\\")) sPath += _T('\\'); // 创建数据库对象 CUIISQLiteServer* pDatabase = new CUIISQLiteServer; if (NULL == pDatabase) return FALSE; CString dbPath = FilePath::GetSysDir(); dbPath += KT_PARAM_DATAFILE; // 连接数据库文件 if (!pDatabase->InitADOServer(dbPath)) { delete pDatabase; return FALSE; } // 初始化数据库对象指针 m_pParamDatabase = pDatabase; // 返回成功状态 return TRUE; } BOOL KTParamService::ReleaseService() { // 检查数据库对象已经删除 if (NULL == m_pParamDatabase) return TRUE; // 删除数据库对象 delete m_pParamDatabase; // 数据库对象指针置空 m_pParamDatabase = NULL; // 返回成功状态 return TRUE; } RuleHandlerFunPtr KTParamService::GetRuleHandler(LPCTSTR pszCurveType, LPCTSTR pszDrawType) const { ASSERT(NULL != pszCurveType && NULL != pszDrawType); CString sText; sText.Format(_T("%s_%s"), pszCurveType, pszDrawType); RuleHandlerFunPtr pfnHandler = NULL; m_mapRuleHandler.Lookup(sText, (void*&)pfnHandler); return pfnHandler; } BOOL KTParamService::SetRuleHandler(LPCTSTR pszCurveType, LPCTSTR pszDrawType, RuleHandlerFunPtr pfnHandler) { ASSERT(NULL != pszCurveType && NULL != pszDrawType); CString sText; sText.Format(_T("%s_%s"), pszCurveType, pszDrawType); if (NULL == pfnHandler) { m_mapRuleHandler.RemoveKey(sText); } else { m_mapRuleHandler[sText] = pfnHandler; } return TRUE; } BOOL KTParamService::CreateParamPart(AcDbVoidPtrArray& arpPart, const CMapStringToString& mapAttrToValue, LPCTSTR pszPartCode) const { // 获得Id KTParamClass data; if (!GetClassItemByCode(pszPartCode, data)) return FALSE; // 通过Id创建 return CreateParamPart(arpPart, mapAttrToValue, data.GetId()); } BOOL KTParamService::CreateParamPart(AcDbVoidPtrArray& arpPart, const CMapStringToString& mapAttrToValue, ULONG lId) const { CMapStringToString mapDefaultValue; return CreateParamPart(arpPart, mapDefaultValue, mapAttrToValue, lId); } BOOL KTParamService::CreateParamPart(AcDbVoidPtrArray& arpPart, CMapStringToString& mapDefaultValue, const CMapStringToString& mapAttrToValue, ULONG lId) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 获得类数据 KTParamClass data; if (!GetClassItemById(lId, data)) return FALSE; // 创建父类型 if (0 != data.GetUpId() && !CreateParamPart(arpPart, mapDefaultValue, mapAttrToValue, data.GetUpId())) return FALSE; // 默认约束参数表达式数据 LPCTSTR pszVar = data.GetLayer(); if (NULL != pszVar && _tcslen(pszVar) > 0) mapDefaultValue.SetAt(data.GetLayerKey(), pszVar); // 取得当前约束数据 KTParamRulePtrArray arpItems; GetRuleItems(lId, arpItems); // 取得图元类型描述表 KTParamTableAttr attribute; GetTableAttrItemByField(_T("Rules_Attr"), _T("CurveType"), attribute); CString sVarDesc = attribute.GetVarDesc(); // 创建约束数据 POSITION pos; CStringArray arsTable; CString sType, sParam; CMapStringToString mapParamToValue, mapFieldToValue, mapParamToType; RuleHandlerFunPtr pfnRuleHandle; resbuf rbHeader, *pRb; AcDbVoidPtrArray arpEnts; // KTParamRule* pRule; int iPos = arpItems.GetSize(); while ((--iPos) >= 0) { pRule = arpItems[iPos]; ASSERT(NULL != pRule); // 清空约束参数表达式数据 mapParamToValue.RemoveAll(); // 取得约束参数表达式数据 GetExpressionItemById(pRule->GetId(), mapParamToValue); // 添加默认约束参数表达式数据 pos = mapDefaultValue.GetStartPosition(); while (NULL != pos) { mapDefaultValue.GetNextAssoc(pos, sParam, sType); if (mapParamToValue[sParam].IsEmpty()) mapParamToValue.SetAt(sParam, sType); } // 取得图元类型表 sType = sVarDesc; if (NULL != _tcschr(sVarDesc, _T(' '))) { mapFieldToValue.RemoveAll(); pRule->MapFieldToValue(mapFieldToValue); if (ExpandSQL(sVarDesc, mapFieldToValue, sParam)) { if (ExecuteSQL(sParam, arsTable)) { sType = arsTable[0]; } } } // 获得参数类型映射 mapParamToType.RemoveAll(); GetCurveDrawTypeParam(sType, pRule->GetCurveType(), pRule->GetDrawType(), mapParamToType, FALSE, FALSE); pfnRuleHandle = GetRuleHandler(pRule->GetCurveType(), pRule->GetDrawType()); if (NULL != pfnRuleHandle) { rbHeader.rbnext = NULL; pRb = &rbHeader; pos = mapParamToType.GetStartPosition(); while (NULL != pos) { mapParamToType.GetNextAssoc(pos, sParam, sType); CreateParamValueResBuf(pRb, sParam, mapParamToValue[sParam], sType, mapAttrToValue); while (NULL != pRb->rbnext) pRb = pRb->rbnext; } arpEnts.setLogicalLength(0); pfnRuleHandle(arpEnts, rbHeader.rbnext); if (!arpEnts.isEmpty()) arpPart.append(arpEnts); acutRelRb(rbHeader.rbnext); } delete pRule; } return TRUE; } static BOOL ParamValueCalcProc(LPCTSTR pszVariable, double& dValue, WPARAM wParam, LPARAM lParam) { ASSERT(NULL != lParam); CMapStringToString* pMapVar = (CMapStringToString*)lParam; CString sValue; if (!pMapVar->Lookup(pszVariable, sValue)) { if (_tcsicmp(pszVariable, _T("PI")) == 0) { dValue = PI; return TRUE; } return FALSE; } dValue = _tcstod(sValue, NULL); return TRUE; } BOOL KTParamService::CreateParamValueResBuf(struct resbuf* pRb, LPCTSTR pszParam, LPCTSTR pszValue, LPCTSTR pszType, const CMapStringToString& mapAttrToValue) const { ASSERT(NULL != pRb); KTExpressCalc calc; calc.SetVariableProc(ParamValueCalcProc, NULL, (LPARAM)&mapAttrToValue); if (_tcsicmp(pszType, _T("Char")) == 0) { CString sValue; int i; double dVar; BOOL bStr = FALSE; CString sSub, sVar; while (_T('\0') != pszValue[0]) { i = _tcsinc(pszValue) - pszValue; if (1 == i) { switch (pszValue[0]) { case _T('\"'): if (bStr) { ExpandSQL(sSub, mapAttrToValue, sVar); sValue += sVar; sSub.Empty(); bStr = FALSE; } else { if (!sSub.IsEmpty() && calc.Calculate(sSub, dVar)) sSub.Format(_T("%g"), dVar); sValue += sSub; sSub.Empty(); bStr = TRUE; } break; case _T(','): if (bStr) sSub += _T(','); else { if (!sSub.IsEmpty() && calc.Calculate(sSub, dVar)) sSub.Format(_T("%g"), dVar); sValue += sSub; sValue += _T(','); sSub.Empty(); } break; case _T('\\'): if (_T('\"') == pszValue[1] || _T('\\') == pszValue[1]) { sSub += pszValue[1]; pszValue++; } else { sSub += _T('\\'); } break; case _T(' '): if (bStr) sSub += _T(' '); break; default: sSub += pszValue[0]; break; } pszValue++; } else { for (; i > 0; i--, pszValue++) sSub += pszValue[0]; } } if (!sSub.IsEmpty()) { if (bStr) { ExpandSQL(sSub, mapAttrToValue, sVar); sValue += sVar; } else { if (calc.Calculate(sSub, dVar)) sSub.Format(_T("%g"), dVar); sValue += sSub; } } pRb->rbnext = acutBuildList(RTSTR, pszParam, RTSTR, (LPCTSTR)sValue, 0); } else { double dValue = 0; ads_point pt = {0}; int i, j = 0; CString sValue; while (_T('\0') != pszValue[0]) { i = _tcsinc(pszValue) - pszValue; if (1 == i) { if (_T(',') == pszValue[0]) { dValue = 0; if (!sValue.IsEmpty() && !calc.Calculate(sValue, dValue)) return FALSE; if (j < 3) pt[j++] = dValue; sValue.Empty(); } else sValue += pszValue[0]; pszValue++; } else { for (; i > 0; i--, pszValue++) sValue += pszValue[0]; } } if (!sValue.IsEmpty()) { dValue = 0; if (!calc.Calculate(sValue, dValue)) return FALSE; if (j < 3) pt[j] = dValue; } if (_tcsicmp(pszType, _T("Int")) == 0 || _tcsicmp(pszType, _T("Bool")) == 0) pRb->rbnext = acutBuildList(RTSTR, pszParam, RTLONG, long(dValue + 0.5), 0); else if (_tcsicmp(pszType, _T("Point")) == 0) pRb->rbnext = acutBuildList(RTSTR, pszParam, RT3DPOINT, pt, 0); else pRb->rbnext = acutBuildList(RTSTR, pszParam, RTREAL, dValue, 0); } return TRUE; } BOOL KTParamService::GetAccessSQL(LPCTSTR pszAccess, CString& sSQL, CString& sFlags) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 构建SQL语句 CString sAccess; sAccess.Format(_T("Select [SQL], [Flags] From [AccessSQL] Where [KEY]=\'%s\' Order By [Index]"), pszAccess); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得操作SQL语句 sSQL.Empty(); sFlags.Empty(); for (int i = 0; i < iRows; i++) { // 取得数据 CStringArray arsValue; vTable.GetValueRecord(i, arsValue); // 将多条数据合并 ASSERT(arsValue.GetSize() > 1); sSQL += arsValue[0]; sFlags += arsValue[1]; } // 返回状态 return (iRows > 0); } BOOL KTParamService::ExpandSQL(LPCTSTR pszSQLExpress, const CMapStringToString& mapVarToValue, CString& sSQL) const { BOOL bVar = FALSE; CString sExpand, sVar, sValue; while (_T('\0') != pszSQLExpress[0]) { int i = _tcsinc(pszSQLExpress) - pszSQLExpress; if (1 == i) { if (bVar) { if (_istalnum(pszSQLExpress[0]) || _T('_') == pszSQLExpress[0]) sVar += pszSQLExpress[0]; else { if (!mapVarToValue.Lookup(sVar, sValue)) return FALSE; bVar = FALSE; sVar.Empty(); sExpand += sValue; sExpand += pszSQLExpress[0]; } } else { if (_T('$') == pszSQLExpress[0]) { if (_T('$') == pszSQLExpress[1]) { sExpand += _T('$'); pszSQLExpress++; } else { bVar = TRUE; } } else { sExpand += pszSQLExpress[0]; } } pszSQLExpress++; } else { for (; i > 0; i--, pszSQLExpress++) { (bVar ? sVar : sExpand) += pszSQLExpress[0]; } } } if (bVar && !sVar.IsEmpty()) { if (!mapVarToValue.Lookup(sVar, sValue)) return FALSE; sExpand += sValue; } sSQL = sExpand; return (!sSQL.IsEmpty()); } BOOL KTParamService::ExecuteSQL(LPCTSTR pszSQL, CStringArray& arsItems) const { ASSERT(NULL != pszSQL && 0 < _tcslen(pszSQL)); // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); int iLen; CString sSub; LPCTSTR pszSub; CString sResult; while (NULL != (pszSub = _tcschr(pszSQL, _T(';')))) { iLen = pszSub - pszSQL; _tcsncpy(sSub.GetBuffer(iLen), pszSQL, iLen); sSub.ReleaseBuffer(); if (!sResult.IsEmpty()) sSub.Replace(_T("#"), sResult); if (sSub.Find(_T("#")) >= 0) return FALSE; if (m_pParamDatabase->GetSelData(sSub, arsItems) > 0 && (iLen = arsItems.GetSize()) > 0) sResult = arsItems[iLen-1]; arsItems.RemoveAll(); pszSQL = pszSub + 1; } sSub = pszSQL; if (!sResult.IsEmpty()) sSub.Replace(_T("#"), sResult); if (sSub.Find(_T("#")) >= 0) return FALSE; m_pParamDatabase->GetSelData(sSub, arsItems); return (arsItems.GetSize() > 0); } BOOL KTParamService::GetTableItemById(LPCTSTR pszSQLKey, ULONG lId, CMapStringToString& mapFieldToValue) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(pszSQLKey, sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lId); // 返回状态 return (m_pParamDatabase->GetSelDataEx(sAccess, mapFieldToValue) > 0); } BOOL KTParamService::GetTableAttrItems(LPCTSTR pszTable, BOOL bOnlyVisible, KTParamTableAttrPtrArray& arpItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL((bOnlyVisible ? _T("GetTableShowAttrs") : _T("GetTableAttrItems")), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('C') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszTable); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamTableAttr* pData; for (int i = 0; i < iRows; i++) { // 创建数据对象 pData = new KTParamTableAttr; if (NULL == pData) continue; // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 14); vRecord.GetValue(0, sValue); pData->SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); pData->SetField(sValue); vRecord.GetValue(2, sValue); pData->SetName(sValue); vRecord.GetValue(3, sValue); pData->SetDesc(sValue); vRecord.GetValue(4, sValue); pData->SetDataType(sValue); vRecord.GetValue(5, sValue); pData->SetValue(sValue); vRecord.GetValue(6, sValue); pData->SetDefault(sValue); vRecord.GetValue(7, sValue); pData->SetVarDesc(sValue); vRecord.GetValue(8, sValue); pData->SetNotNull(_ttoi(sValue)); vRecord.GetValue(9, sValue); pData->SetVisible(_ttoi(sValue)); vRecord.GetValue(10, sValue); pData->SetOverride(_ttoi(sValue)); vRecord.GetValue(11, sValue); pData->SetReadOnly(_ttoi(sValue)); vRecord.GetValue(12, sValue); pData->SetNeedSave(_ttoi(sValue)); vRecord.GetValue(13, sValue); pData->SetIndex(_ttol(sValue)); vRecord.GetValue(14, sValue); pData->SetFlags(sValue); // 添加到数组中 arpItems.Add(pData); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetTableAttrItemByField(LPCTSTR pszTable, LPCTSTR pszFiled, KTParamTableAttr& data) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetTableAttrItemByField"), sSQL, sFlags); if (sFlags.GetLength() != 2 || _T('C') != sFlags[0] || _T('C') != sFlags[1]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszTable, pszFiled); // 获得数据 CString sValue; CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); ASSERT(iRows <= 1); if (iRows > 0) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(0, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 14); vRecord.GetValue(0, sValue); data.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); data.SetField(sValue); vRecord.GetValue(2, sValue); data.SetName(sValue); vRecord.GetValue(3, sValue); data.SetDesc(sValue); vRecord.GetValue(4, sValue); data.SetDataType(sValue); vRecord.GetValue(5, sValue); data.SetValue(sValue); vRecord.GetValue(6, sValue); data.SetDefault(sValue); vRecord.GetValue(7, sValue); data.SetVarDesc(sValue); vRecord.GetValue(8, sValue); data.SetNotNull(_ttoi(sValue)); vRecord.GetValue(9, sValue); data.SetVisible(_ttoi(sValue)); vRecord.GetValue(10, sValue); data.SetOverride(_ttoi(sValue)); vRecord.GetValue(11, sValue); data.SetReadOnly(_ttoi(sValue)); vRecord.GetValue(12, sValue); data.SetNeedSave(_ttoi(sValue)); vRecord.GetValue(13, sValue); data.SetIndex(_ttol(sValue)); vRecord.GetValue(14, sValue); data.SetFlags(sValue); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetTableMapItems(LPCTSTR pszTable, LPCTSTR pszField1, LPCTSTR pszField2, CMapStringToString& mapItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetTableMapItems"), sSQL, sFlags); if (sFlags.GetLength() != 3 || _T('C') != sFlags[0] || _T('C') != sFlags[1] || _T('C') != sFlags[2]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszField1, pszField2, pszTable); // 返回状态 return (m_pParamDatabase->GetSelData(sAccess, mapItems) > 0); } BOOL KTParamService::GetTableFieldItems(LPCTSTR pszTable, LPCTSTR pszField, CStringArray& arsValue) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetTableFieldItems"), sSQL, sFlags); if (sFlags.GetLength() != 2 || _T('C') != sFlags[0] || _T('C') != sFlags[1]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszField, pszTable); // 返回状态 return (m_pParamDatabase->GetSelData(sAccess, arsValue) > 0); } BOOL KTParamService::GetSubClassItems(ULONG lParentId, KTParamClassArray& arItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetSubClassItems"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lParentId); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamClass data; for (int i = 0; i < iRows; i++) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 9); vRecord.GetValue(0, sValue); data.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); data.SetUpId(_ttol(sValue)); vRecord.GetValue(2, sValue); data.SetCode(sValue); vRecord.GetValue(3, sValue); data.SetName(sValue); vRecord.GetValue(4, sValue); data.SetDesc(sValue); vRecord.GetValue(5, sValue); data.SetIcon1(sValue); vRecord.GetValue(6, sValue); data.SetIcon2(sValue); vRecord.GetValue(7, sValue); data.SetReadOnly(_ttoi(sValue)); vRecord.GetValue(8, sValue); data.SetFlags(sValue); vRecord.GetValue(9, sValue); data.SetLayer(sValue); // 添加到数组中 arItems.Add(data); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetClassItemById(ULONG lId, KTParamClass& data) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetClassItemById"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lId); // 获得数据 CString sValue; CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); ASSERT(iRows <= 1); if (iRows > 0) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(0, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 9); vRecord.GetValue(0, sValue); data.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); data.SetUpId(_ttol(sValue)); vRecord.GetValue(2, sValue); data.SetCode(sValue); vRecord.GetValue(3, sValue); data.SetName(sValue); vRecord.GetValue(4, sValue); data.SetDesc(sValue); vRecord.GetValue(5, sValue); data.SetIcon1(sValue); vRecord.GetValue(6, sValue); data.SetIcon2(sValue); vRecord.GetValue(7, sValue); data.SetReadOnly(_ttoi(sValue)); vRecord.GetValue(8, sValue); data.SetFlags(sValue); vRecord.GetValue(9, sValue); data.SetLayer(sValue); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetClassItemByCode(LPCTSTR pszCode, KTParamClass& data) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetClassItemByCode"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('C') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszCode); // 获得数据 CString sValue; CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); ASSERT(iRows <= 1); if (iRows > 0) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(0, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 9); vRecord.GetValue(0, sValue); data.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); data.SetUpId(_ttol(sValue)); vRecord.GetValue(2, sValue); data.SetCode(sValue); vRecord.GetValue(3, sValue); data.SetName(sValue); vRecord.GetValue(4, sValue); data.SetDesc(sValue); vRecord.GetValue(5, sValue); data.SetIcon1(sValue); vRecord.GetValue(6, sValue); data.SetIcon2(sValue); vRecord.GetValue(7, sValue); data.SetReadOnly(_ttoi(sValue)); vRecord.GetValue(8, sValue); data.SetFlags(sValue); vRecord.GetValue(9, sValue); data.SetLayer(sValue); } // 返回状态 return (iRows > 0); } BOOL KTParamService::HasSameClassCode(LPCTSTR pszCode, ULONG lExceptId) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("HasSameClassCode"), sSQL, sFlags); if (sFlags.GetLength() != 2 || sFlags.CompareNoCase(_T("CN")) != 0) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszCode, lExceptId); // 获得数据 return (!m_pParamDatabase->IsSelEmpty(sAccess)); } BOOL KTParamService::GetAttributeItems(ULONG lClassId, KTParamAttributeArray& arItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetAttributeItems"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamAttribute cData; for (int i = 0; i < iRows; i++) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 15); vRecord.GetValue(0, sValue); cData.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); cData.SetClassId(_ttol(sValue)); vRecord.GetValue(2, sValue); cData.SetCode(sValue); vRecord.GetValue(3, sValue); cData.SetName(sValue); vRecord.GetValue(4, sValue); cData.SetDesc(sValue); vRecord.GetValue(5, sValue); cData.SetDataType(sValue); vRecord.GetValue(6, sValue); cData.SetValue(sValue); vRecord.GetValue(7, sValue); cData.SetDefault(sValue); vRecord.GetValue(8, sValue); cData.SetVarDesc(sValue); vRecord.GetValue(9, sValue); cData.SetNotNull(_ttoi(sValue)); vRecord.GetValue(10, sValue); cData.SetVisible(_ttoi(sValue)); vRecord.GetValue(11, sValue); cData.SetOverride(_ttoi(sValue)); vRecord.GetValue(12, sValue); cData.SetReadOnly(_ttoi(sValue)); vRecord.GetValue(13, sValue); cData.SetNeedSave(_ttoi(sValue)); vRecord.GetValue(14, sValue); cData.SetIndex(_ttol(sValue)); vRecord.GetValue(15, sValue); cData.SetFlags(sValue); // 添加到数组中 arItems.Add(cData); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetAttributeItems(ULONG lClassId, KTParamAttributePtrArray& arpItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetAttributeItems"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamAttribute* pData; for (int i = 0; i < iRows; i++) { // 创建数据对象 pData = new KTParamAttribute; if (NULL == pData) continue; // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 15); vRecord.GetValue(0, sValue); pData->SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); pData->SetClassId(_ttol(sValue)); vRecord.GetValue(2, sValue); pData->SetCode(sValue); vRecord.GetValue(3, sValue); pData->SetName(sValue); vRecord.GetValue(4, sValue); pData->SetDesc(sValue); vRecord.GetValue(5, sValue); pData->SetDataType(sValue); vRecord.GetValue(6, sValue); pData->SetValue(sValue); vRecord.GetValue(7, sValue); pData->SetDefault(sValue); vRecord.GetValue(8, sValue); pData->SetVarDesc(sValue); vRecord.GetValue(9, sValue); pData->SetNotNull(_ttoi(sValue)); vRecord.GetValue(10, sValue); pData->SetVisible(_ttoi(sValue)); vRecord.GetValue(11, sValue); pData->SetOverride(_ttoi(sValue)); vRecord.GetValue(12, sValue); pData->SetReadOnly(_ttoi(sValue)); vRecord.GetValue(13, sValue); pData->SetNeedSave(_ttoi(sValue)); vRecord.GetValue(14, sValue); pData->SetIndex(_ttol(sValue)); vRecord.GetValue(15, sValue); pData->SetFlags(sValue); // 添加到数组中 arpItems.Add(pData); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetRuleItems(ULONG lClassId, KTParamRuleArray& arItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetRuleItems"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamRule cData; for (int i = 0; i < iRows; i++) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 5); vRecord.GetValue(0, sValue); cData.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); cData.SetClassId(_ttol(sValue)); vRecord.GetValue(2, sValue); cData.SetCurveType(sValue); vRecord.GetValue(3, sValue); cData.SetDrawType(sValue); vRecord.GetValue(4, sValue); cData.SetIndex(_ttol(sValue)); vRecord.GetValue(5, sValue); cData.SetFlags(sValue); // 添加到数组中 arItems.Add(cData); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetRuleItems(ULONG lClassId, KTParamRulePtrArray& arpItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetRuleItems"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamRule* pData; for (int i = 0; i < iRows; i++) { // 创建数据对象 pData = new KTParamRule; if (NULL == pData) continue; // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 5); vRecord.GetValue(0, sValue); pData->SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); pData->SetClassId(_ttol(sValue)); vRecord.GetValue(2, sValue); pData->SetCurveType(sValue); vRecord.GetValue(3, sValue); pData->SetDrawType(sValue); vRecord.GetValue(4, sValue); pData->SetIndex(_ttol(sValue)); vRecord.GetValue(5, sValue); pData->SetFlags(sValue); // 添加到数组中 arpItems.Add(pData); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetRuleItemIds(ULONG lClassId, CStringArray& arsItemIds) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetRuleItemIds"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 获得数据 return (m_pParamDatabase->GetSelData(sAccess, arsItemIds) > 0); } BOOL KTParamService::GetExpressionItems(ULONG lRuleId, KTParamExpressionArray& arItems) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetExpressionItems"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lRuleId); // 获得数据 CUIIValueTable vTable; int iRows = m_pParamDatabase->GetSelData(sAccess, vTable); // 获得所有数据条目 CString sValue; KTParamExpression data; for (int i = 0; i < iRows; i++) { // 取得数据 CUIIValueRecord vRecord; vTable.GetValueRecord(i, vRecord); // 将数据导入对象中 ASSERT(vRecord.GetLableLogicSize() > 5); vRecord.GetValue(0, sValue); data.SetId(_ttol(sValue)); vRecord.GetValue(1, sValue); data.SetRuleId(_ttol(sValue)); vRecord.GetValue(2, sValue); data.SetVarType(sValue); vRecord.GetValue(3, sValue); data.SetValue(sValue); vRecord.GetValue(4, sValue); data.SetIndex(_ttol(sValue)); vRecord.GetValue(5, sValue); data.SetFlags(sValue); // 添加到数组中 arItems.Add(data); } // 返回状态 return (iRows > 0); } BOOL KTParamService::GetExpressionItemById(ULONG lRuleId, CMapStringToString& mapVarTypeToValue) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetExpressionItemById"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lRuleId); // 获得数据 return (m_pParamDatabase->GetSelData(sAccess, mapVarTypeToValue) > 0); } BOOL KTParamService::GetCurveDrawTypeParam(LPCTSTR pszCurveTable, LPCTSTR pszCurveType, LPCTSTR pszDrawType, CMapStringToString& mapParamToDesc, BOOL bRev, BOOL bDesc) const { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetSubTypeTable"), sSQL, sFlags); if (sFlags.GetLength() != 2 || _T('C') != sFlags[0] || _T('C') != sFlags[1]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pszCurveTable, pszCurveType); // 获得绘制类型数据表 CString sTable; m_pParamDatabase->GetSelData(sAccess, sTable); if (sTable.IsEmpty()) return FALSE; // 获得参数表 sAccess.Format(sSQL, sTable, pszDrawType); m_pParamDatabase->GetSelData(sAccess, sTable); if (bDesc) return (bRev ? GetDescToValueMap(sTable, mapParamToDesc) : GetValueToDescMap(sTable, mapParamToDesc)); else return (bRev ? GetTypeToValueMap(sTable, mapParamToDesc) : GetValueToTypeMap(sTable, mapParamToDesc)); } BOOL KTParamService::UpdateClassData(KTParamClass* pData) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("GetClassItemIdById"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, pData->GetId()); // 判断是否存在 if (m_pParamDatabase->IsSelEmpty(sAccess)) { // 取得操作SQL语句,检查参数合法性 GetAccessSQL(_T("InsertClassItem"), sSQL, sFlags); if (sFlags.GetLength() != 3 || sFlags.CompareNoCase(_T("NC7")) != 0) return FALSE; // 构造完整SQL语句 sAccess.Format(sSQL, pData->GetUpId(), pData->GetCode(), pData->GetName(), pData->GetDesc(), pData->GetIcon1(), pData->GetIcon2(), BoolToString(pData->IsReadOnly()), pData->GetFlags(), pData->GetLayer()); // 插入数据 m_pParamDatabase->ExecuteSQL(sAccess); // 取得操作SQL语句,检查参数合法性 GetAccessSQL(_T("GetClassItemIdByUpIdCode"), sSQL, sFlags); if (sFlags.GetLength() != 2 || sFlags.CompareNoCase(_T("NC")) != 0) return FALSE; // 构造完整SQL语句 sAccess.Format(sSQL, pData->GetUpId(), pData->GetCode()); // 取得插入后的ID if (m_pParamDatabase->GetSelData(sAccess, sFlags) <= 0) return FALSE; pData->SetId(StringToLong(sFlags)); return (pData->GetId() > 0); } else { // 取得操作SQL语句,检查参数合法性 GetAccessSQL(_T("UpdateClassItemById"), sSQL, sFlags); if (sFlags.GetLength() != 4 || sFlags.CompareNoCase(_T("NC7N")) != 0) return FALSE; // 构造完整SQL语句 sAccess.Format(sSQL, pData->GetUpId(), pData->GetCode(), pData->GetName(), pData->GetDesc(), pData->GetIcon1(), pData->GetIcon2(), BoolToString(pData->IsReadOnly()), pData->GetFlags(), pData->GetLayer(), pData->GetId()); // 更新数据 return m_pParamDatabase->ExecuteSQL(sAccess); } } BOOL KTParamService::UpdateAttributeData(ULONG lClassId, KTParamAttributePtrArray& arpData) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得更新操作SQL语句,检查参数合法性 CString sUpdateSQL, sFlags; GetAccessSQL(_T("UpdateAttrItemById"), sUpdateSQL, sFlags); if (sFlags.GetLength() != 7 || sFlags.CompareNoCase(_T("NC12NCN")) != 0) return FALSE; // 取得插入操作SQL语句,检查参数合法性 CString sInsertSQL; GetAccessSQL(_T("InsertAttrItem"), sInsertSQL, sFlags); if (sFlags.GetLength() != 6 || sFlags.CompareNoCase(_T("NC12NC")) != 0) return FALSE; // 取得删除操作SQL语句,检查参数合法性 CString sDeleteSQL; GetAccessSQL(_T("DeleteAttrItemById"), sDeleteSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; KTParamAttributeArray arItems; GetAttributeItems(lClassId, arItems); CString sAccess; KTParamAttribute* pOld; KTParamAttribute* pData; int iIndex, iSize = arpData.GetSize(); for (int i = 0; i < iSize; i++) { pData = arpData[i]; ASSERT(NULL != pData); if ((iIndex = arItems.GetSize() - 1) >= 0) { pOld = &(arItems[iIndex]); arItems.RemoveAt(iIndex); // 构造完整SQL语句 sAccess.Format(sUpdateSQL, lClassId, pData->GetCode(), pData->GetName(), pData->GetDesc(), pData->GetDataType(), pData->GetValue(), pData->GetDefault(), pData->GetVarDesc(), BoolToString(pData->IsNotNull()), BoolToString(pData->IsVisible()), BoolToString(pData->IsOverride()), BoolToString(pData->IsReadOnly()), BoolToString(pData->IsNeedSave()), pData->GetIndex(), pData->GetFlags(), pOld->GetId()); // 更新数据 m_pParamDatabase->ExecuteSQL(sAccess); } else { // 构造完整SQL语句 sAccess.Format(sInsertSQL, lClassId, pData->GetCode(), pData->GetName(), pData->GetDesc(), pData->GetDataType(), pData->GetValue(), pData->GetDefault(), pData->GetVarDesc(), BoolToString(pData->IsNotNull()), BoolToString(pData->IsVisible()), BoolToString(pData->IsOverride()), BoolToString(pData->IsReadOnly()), BoolToString(pData->IsNeedSave()), pData->GetIndex(), pData->GetFlags()); // 插入数据 m_pParamDatabase->ExecuteSQL(sAccess); } } // 删除原有多余的属性数据 iIndex = arItems.GetSize(); while ((--iIndex) >= 0) { pOld = &(arItems[iIndex]); // 构造完整SQL语句 sAccess.Format(sDeleteSQL, pOld->GetId()); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); } return TRUE; } BOOL KTParamService::UpdateRuleData(ULONG lClassId, KTParamRulePtrArray& arpData) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得更新操作SQL语句,检查参数合法性 CString sUpdateSQL, sFlags; GetAccessSQL(_T("UpdateRuleById"), sUpdateSQL, sFlags); if (sFlags.GetLength() != 6 || sFlags.CompareNoCase(_T("NCCNCN")) != 0) return FALSE; // 取得插入操作SQL语句,检查参数合法性 CString sInsertSQL; GetAccessSQL(_T("InsertRuleItem"), sInsertSQL, sFlags); if (sFlags.GetLength() != 5 || sFlags.CompareNoCase(_T("NCCNC")) != 0) return FALSE; // 取得删除操作SQL语句,检查参数合法性 CString sDeleteSQL; GetAccessSQL(_T("DeleteRuleById"), sDeleteSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 取得操作SQL语句,检查参数合法性 CString sGetDataSQL; GetAccessSQL(_T("GetRuleItemIdByClsIdIdx"), sGetDataSQL, sFlags); if (sFlags.GetLength() != 2 || sFlags.CompareNoCase(_T("NN")) != 0) return FALSE; KTParamRuleArray arItems; GetRuleItems(lClassId, arItems); CString sAccess; KTParamRule* pOld; KTParamRule* pData; int iIndex, iSize = arpData.GetSize(); for (int i = 0; i < iSize; i++) { pData = arpData[i]; ASSERT(NULL != pData); if ((iIndex = arItems.GetSize() - 1) >= 0) { pOld = &(arItems[iIndex]); arItems.RemoveAt(iIndex); // 构造完整SQL语句 sAccess.Format(sUpdateSQL, lClassId, pData->GetCurveType(), pData->GetDrawType(), pData->GetIndex(), pData->GetFlags(), pOld->GetId()); // 更新数据 m_pParamDatabase->ExecuteSQL(sAccess); UpdateExpressionData(pOld->GetId(), pData->m_arExpression); } else { // 构造完整SQL语句 sAccess.Format(sInsertSQL, lClassId, pData->GetCurveType(), pData->GetDrawType(), pData->GetIndex(), pData->GetFlags()); // 插入数据 m_pParamDatabase->ExecuteSQL(sAccess); // 构造完整SQL语句 sAccess.Format(sGetDataSQL, lClassId, pData->GetIndex()); // 取得插入后的ID if (m_pParamDatabase->GetSelData(sAccess, sFlags) > 0) { pData->SetId(StringToLong(sFlags)); UpdateExpressionData(pData->GetId(), pData->m_arExpression); } } pData->m_arExpression.RemoveAll(); } // 删除原有多余的属性数据 iIndex = arItems.GetSize(); while ((--iIndex) >= 0) { pOld = &(arItems[iIndex]); // 构造完整SQL语句 sAccess.Format(sDeleteSQL, pOld->GetId()); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); DeleteExpressData(pOld->GetId()); } return TRUE; } BOOL KTParamService::UpdateExpressionData(ULONG lRuleId, KTParamExpressionArray& arpData) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得更新操作SQL语句,检查参数合法性 CString sUpdateSQL, sFlags; GetAccessSQL(_T("UpdateExpressItemById"), sUpdateSQL, sFlags); if (sFlags.GetLength() != 6 || sFlags.CompareNoCase(_T("NCCNCN")) != 0) return FALSE; // 取得插入操作SQL语句,检查参数合法性 CString sInsertSQL; GetAccessSQL(_T("InsertExpressItem"), sInsertSQL, sFlags); if (sFlags.GetLength() != 5 || sFlags.CompareNoCase(_T("NCCNC")) != 0) return FALSE; // 取得删除操作SQL语句,检查参数合法性 CString sDeleteSQL; GetAccessSQL(_T("DeleteExpressItemById"), sDeleteSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; KTParamExpressionArray arItems; GetExpressionItems(lRuleId, arItems); CString sAccess; KTParamExpression* pOld; KTParamExpression* pData; int iIndex, iSize = arpData.GetSize(); for (int i = 0; i < iSize; i++) { pData = &(arpData[i]); ASSERT(NULL != pData); if ((iIndex = arItems.GetSize() - 1) >= 0) { pOld = &(arItems[iIndex]); arItems.RemoveAt(iIndex); // 构造完整SQL语句 sAccess.Format(sUpdateSQL, lRuleId, pData->GetVarType(), pData->GetValue(), pData->GetIndex(), pData->GetFlags(), pOld->GetId()); // 更新数据 m_pParamDatabase->ExecuteSQL(sAccess); } else { // 构造完整SQL语句 sAccess.Format(sInsertSQL, lRuleId, pData->GetVarType(), pData->GetValue(), pData->GetIndex(), pData->GetFlags()); // 插入数据 m_pParamDatabase->ExecuteSQL(sAccess); } } // 删除原有多余的属性数据 iIndex = arItems.GetSize(); while ((--iIndex) >= 0) { pOld = &(arItems[iIndex]); // 构造完整SQL语句 sAccess.Format(sDeleteSQL, pOld->GetId()); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); } return TRUE; } BOOL KTParamService::DeleteClassData(ULONG lId) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("DeleteClassItemById"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lId); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); return FALSE; } BOOL KTParamService::DeleteAttributeData(ULONG lClassId) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("DeleteAttrItemByClass"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); return FALSE; } BOOL KTParamService::DeleteRuleData(ULONG lClassId) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("DeleteRuleItemByClass"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lClassId); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); return FALSE; } BOOL KTParamService::DeleteExpressData(ULONG lRuleId) { // 确保数据库连接成功 ASSERT(NULL != m_pParamDatabase); // 取得操作SQL语句,检查参数合法性 CString sSQL, sFlags; GetAccessSQL(_T("DeleteExpressByRule"), sSQL, sFlags); if (sFlags.GetLength() != 1 || _T('N') != sFlags[0]) return FALSE; // 构造完整SQL语句 CString sAccess; sAccess.Format(sSQL, lRuleId); // 删除数据 m_pParamDatabase->ExecuteSQL(sAccess); return FALSE; }