- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2013-11-26 13:28 编辑
u010402865 发表于 2013-11-26 10:32
不合理的需求导致蹩脚的设计。把SQL语句再用结构体封装,有这个必要么?看你的这个需求,我认你应该好好 ...
给你看一个我最近的项目,还没有完的。
把一个,你所说的,包装SQL的应用,改造成DAU的应用。
原因是,原来的性能太低,内存泄漏,不能移植到其他数据库。新的解决这3个问题。
注释的部分是原来的程序,可对比一下:- bool CDataParameter::loadCardType()
- {
- CD_YKT_APPLICATION_MODE_stu rec;
- CD_YKT_FARE_CARD_TYPE_stu f_rec;
- int ret;
- char stmt[4096],*p;
- DAU q_DAU,f_DAU;
- DAU_init(&q_DAU,m_DbConnect,NULL,&rec,CD_YKT_APPLICATION_MODE_tpl);//把结构和模板组装在一起,形成可反射的‘对象’
- DAU_init(&f_DAU,m_DbConnect,NULL,&f_rec,CD_YKT_FARE_CARD_TYPE_tpl);
- /*
- //输出调试信息
- CsVerbose("Begin ApplicationMode: %s\n", "");//KTH 20101005 增加提示信息
- CsDebug( YKT_DBG_CONN, ( YKT_DBG_CONN, "Query table: '%s'.\n", "CD_YKT_APPLICATION_MODE" ) );
- //查询数据
- std::ostringstream sql;
- sql << "SELECT t.MODE_ID FROM afc_cd.CD_YKT_APPLICATION_MODE t "
- << AppendWhere()
- << "ORDER BY t.MODE_ID ASC";
- StructuredQuery q("CD_YKT_APPLICATION_MODE");
- StructuredQueryResultset r;
- add_column<SQUInt> ("MODE_ID", q);
- do_query(sql.str().c_str(), q, r, *(GetConnect()->datasource()));//,GetSid());
- if(r.size() > 0)
- {
- for(StructuredQuery* row = r.getFirstRow(); row; row = r.getNextRow())
- {
- DataApplicationMode ApplicationMode;
- ApplicationMode.modeID = extract<uint32, SQUInt>(row->getFirstColumn());
- //根据每一个ModeID,继续查询数据
- CsDebug( YKT_DBG_CONN, ( YKT_DBG_CONN, "Query table: '%s'.\n", "CD_YKT_FARE_CARD_TYPE" ) );
- std::ostringstream sqlCardType;
- sql.str("");
- sql << "SELECT t.CARD_PHYSICAL_TYPE, t.CARD_LOGICAL_TYPE, t.CARD_TYPE_NAME, t.CARD_ATTRIBUTE FROM afc_cd.CD_YKT_FARE_CARD_TYPE t "
- << AppendWhere();
- StructuredQuery qCardType("CD_YKT_FARE_CARD_TYPE");
- StructuredQueryResultset rCardType;
- add_column<SQUInt> ("CARD_PHYSICAL_TYPE", qCardType);
- add_column<SQUInt> ("CARD_LOGICAL_TYPE", qCardType);
- add_column<SQString> ("CARD_TYPE_NAME",160, qCardType);
- add_column<SQUInt> ("CARD_ATTRIBUTE", qCardType);
- do_query(sql.str().c_str(), qCardType, rCardType, *(GetConnect()->datasource()));//,GetSid());
- ApplicationMode.cardTypeNum = rCardType.size();
- if(rCardType.size() > 0)
- {
- for(StructuredQuery* row = rCardType.getFirstRow(); row; row = rCardType.getNextRow())
- {
- DataCardType CardType;
- CardType.physicalType = extract<uint32, SQUInt>(row->getFirstColumn());
- CardType.logicalType = extract<uint32, SQUInt>(row->getNextColumn());
- std::string name = (std::string&)extract<std::string, SQString>(row->getNextColumn());
- //中文名进行编码转换
- char strName[30];
- memset(strName,0,sizeof(strName));
- strcpy(strName,name.c_str());
- utf8togb2312Ykt(strName,30,CardType.cardTypeName,16);
- CardType.cardAttribute = extract<uint32, SQUInt>(row->getNextColumn());
- ApplicationMode.vDataCardType.push_back(CardType);
- }
- }
- m_DataApplicationMode.push_back(ApplicationMode);
- }
- }
- */
- rec.parameter_ver=(INT64)m_version;
- p=mk_where("parameter_ver",stmt);
- p=stpcpy(p," ORDER BY MODE_ID ASC");
- ret=DAU_select(&q_DAU,stmt,0);
- if(ret>0) {
- //根据每一个ModeID,继续查询数据 -- 笛卡尔积
- DataCardType CardType;
- DataApplicationMode ApplicationMode;
- f_rec.parameter_ver=m_version;
- mk_where("parameter_ver",stmt);
- while(!DAU_next(&q_DAU)) {
- ApplicationMode.modeID = (U32_t)rec.mode_id;
- ret=DAU_prepare(&f_DAU,stmt);
- if(ret==0) while(!DAU_next(&f_DAU)) {
- CardType.physicalType = (U32_t)f_rec.card_physical_type;
- CardType.logicalType = (U32_t)f_rec.card_logical_type;
- CardType.cardAttribute = (U32_t)f_rec.card_attribute;
- //中文名进行编码转换
- utf8togb2312Ykt(f_rec.card_type_name,strlen(f_rec.card_type_name),
- CardType.cardTypeName,16);
- ApplicationMode.vDataCardType.push_back(CardType);
- }
- }
- }
- DAU_free(&q_DAU);
- DAU_free(&f_DAU);
- return true;
- }
-
复制代码 它定义的数据结构与数据库有差异,否则我还可以减少不少语句。
|
|