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();
}