oracle数据库occi库,加入自定义数据类型的读写类

2007年的版本,参考用

using namespace std;
using namespace oracle::occi;

//数据库中的自定义类型.
class OBJ_NAME_INF : public oracle::occi::PObject	//继承自occi的类型,且要重载一系列函数
{
public:
	OCCI_STD_NAMESPACE::string NAME_INF;
	OCCI_STD_NAMESPACE::string LANG_CD;
	OCCI_STD_NAMESPACE::string ON_FLG;
public:
	void *operator new(size_t size){										//必要重载
		return oracle::occi::PObject::operator new(size);
	}
	void *operator new(size_t size, const oracle::occi::Connection * sess,
		const OCCI_STD_NAMESPACE::string& table){							//必要重载
			return oracle::occi::PObject::operator new(size, sess, table,
				(char *) "NETRDB.OBJ_NAME_INF");
	}
	void *operator new(size_t size, void *ctxOCCI_){						//必要重载
		return oracle::occi::PObject::operator new(size, ctxOCCI_);
	}
	void *operator new(size_t size, const oracle::occi::Connection *sess,
		const OCCI_STD_NAMESPACE::string &tableName,
		const OCCI_STD_NAMESPACE::string &typeName,
		const OCCI_STD_NAMESPACE::string &tableSchema,
		const OCCI_STD_NAMESPACE::string &typeSchema){						//必要重载
			return oracle::occi::PObject::operator new(size, sess, tableName,
				typeName, tableSchema, typeSchema);
	}
	string getSQLTypeName() const{											//必要重载
		return OCCI_STD_NAMESPACE::string("NETRDB.OBJ_NAME_INF");
	}
	void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
		unsigned int &schemaNameLen, void **typeName,
		unsigned int &typeNameLen) const{									//必要重载
			PObject::getSQLTypeName(env, &OBJ_NAME_INF::readSQL, schemaName,
				schemaNameLen, typeName, typeNameLen);
	}
	void SetInfor(const string &s1){										//此函数用于简化数据设置
		NAME_INF	= s1;
		CSAPI::format(LANG_CD, "%02d", static_cast<UINT32>(CHINA_LANG_CODE));
		ON_FLG		= "0";	//?值未知
	}
	OBJ_NAME_INF(){}
	OBJ_NAME_INF(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) {}		//必要函数
	static void *readSQL(void *ctxOCCI_){									//必要函数
		OBJ_NAME_INF *objOCCI_ = new OBJ_NAME_INF(ctxOCCI_);
		oracle::occi::AnyData streamOCCI_(ctxOCCI_);
		try
		{
			if (streamOCCI_.isNull())
				objOCCI_->setNull();
			else
				objOCCI_->readSQL(streamOCCI_);
		}
		catch (oracle::occi::SQLException& excep)
		{
			delete objOCCI_;
			excep.setErrorCtx(ctxOCCI_);
			return (void *)NULL;
		}
		return (void *)objOCCI_;
	}
	virtual void readSQL(oracle::occi::AnyData& streamOCCI_){				//必要函数
		NAME_INF = streamOCCI_.getString();
		LANG_CD = streamOCCI_.getString();
		ON_FLG = streamOCCI_.getString();
	}
	static void writeSQL(void *objectOCCI_, void *ctxOCCI_){				//必要函数
		OBJ_NAME_INF *objOCCI_ = (OBJ_NAME_INF *)objectOCCI_;
		oracle::occi::AnyData streamOCCI_(ctxOCCI_);
		try
		{
			if (objOCCI_->isNull())
				streamOCCI_.setNull();
			else
				objOCCI_->writeSQL(streamOCCI_);
		}
		catch (oracle::occi::SQLException& excep)
		{
			excep.setErrorCtx(ctxOCCI_);
		}
		return;
	}
	virtual void writeSQL(oracle::occi::AnyData& streamOCCI_){				//必要函数
		streamOCCI_.setString(NAME_INF);
		streamOCCI_.setString(LANG_CD);
		streamOCCI_.setString(ON_FLG);
	}
	virtual ~OBJ_NAME_INF(){}
};
typedef std::vector<OBJ_NAME_INF*> T_NAME_INF;//自定义类型数据集

自定义类型注册


	void Mappings(){    //自定义类型注册(linlee)
		oracle::occi::Map *mapOCCI_ = m_p_env->getMap();
		mapOCCI_->put("NETRDB.OBJ_NAME_INF", &OBJ_NAME_INF::readSQL, &OBJ_NAME_INF::writeSQL);
	}
//插入一个OBJ_NAME_INF数据
void InsertAllDataToDB::SetUserDefinedData(RecordSet* m_p_record_set, UINT32 i, T_NAME_INF &t, KSTRING &s){
	OBJ_NAME_INF *pObj = new OBJ_NAME_INF;			//
	pObj->SetInfor(s);
	t.push_back(pObj);
	m_p_record_set->Set(i, t, KSTRING("T_NAME_INF"));
}

数据库批量插入数据,用到了自定义类型的插入


void InsertAllDataToDB::InToDB_Area1()
{
	//MAP_BS_AREA_INF1数据在LoadGlobleData::g_mapAreaLev[AreaLev0]
	const MifArea_map &mapArea = LoadGlobleData::GetAreaLev(AREA_LEV0);	//获得内存数据集
	if(false == m_p_record_set->SetSQL(INSERT_AREA_INF1))
	{				//设置数据集的数据库访问脚本
		CSERROR("以下语句运行失败m_p_record_set->SetSQL(%s)", INSERT_AREA_INF1);
		return;
	}
	KSTRING s;
	MifAreaItem *p = NULL;
	T_NAME_INF tNameInf;
	for(MifArea_map::const_iterator i = mapArea.begin(); i != mapArea.end(); ++i){
		p = i->second;
		CSAPI::format(s, "%04d", static_cast<UINT32>(p->uiCode.wCode[AREA_LEV0]));
		m_p_record_set->SetKSTRING(1, s);
		SetUserDefinedData(m_p_record_set, 2, tNameInf, p->name[AREA_LEV0]);
		m_p_record_set->AddToBuffer();
		//
		DelObj(tNameInf);
	}
	m_p_record_set->Update();
}

猜你喜欢

转载自blog.csdn.net/weixin_43172531/article/details/103767531