基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具

时间:2021-08-09 07:46:15

基于OCILIB的oracle数据库操作总结

1.       类图

基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具

2.       基类BaseOCIDao的设计与实现

BaseOCIDao.h头文件

#pragma once

/* --------------------------------------------------------------------------------------------- *
 * INCLUDES
 * --------------------------------------------------------------------------------------------- */

#include "ocilib.h"
#include <string>
#include <vector>
using namespace std;
/* --------------------------------------------------------------------------------------------- *
 * PLATFORMS
 * --------------------------------------------------------------------------------------------- */

#ifdef _MSC_VER

  #if defined(OCI_CHARSET_WIDE)
      #pragma comment(lib, "ocilibw.lib")
  #elif defined(OCI_CHARSET_ANSI)
      #pragma comment(lib, "ociliba.lib")
  #endif

#endif

#ifndef OCI_SHARED_LIB
    #if defined(_WINDOWS)
        #define OCI_SHARED_LIB                   "oci.dll"
    #elif defined(__APPLE__)
        #define OCI_SHARED_LIB                   "libclntsh.dylib"
    #elif defined(__hppa)
        #define OCI_SHARED_LIB                   "libclntsh.sl"
    #else
        #define OCI_SHARED_LIB                   "libclntsh.so"
    #endif
#endif

#define print_frmt(f, x)    printf(f, x)
#define print_text(x)       printf(x)

#if defined(OCI_CHARSET_WIDE)
#ifdef _WINDOWS
#define print_ostr(x)   wprintf(OTEXT("%s"), x)
#else
#define print_ostr(x)   printf("%ls", x)
#endif
#else
#define print_ostr(x)   printf(OTEXT("%s"), x)
#endif

class BaseOCIDao
{
protected:
    string m_ip;
    unsigned int m_port;
    string m_inst;
    string m_user;
    string m_pwd;
    unsigned int m_mode;

    OCI_Statement* m_stmt;
    OCI_Connection* m_conn;

    bool m_useTrans;
    bool m_IsConnected;
    bool m_ShareConn;
    POCI_ERROR m_ErrHandler;
    vector<BaseOCIDao*> m_Children;
public:
    BaseOCIDao();
    BaseOCIDao(string ip,unsigned int port,string inst,string user,string pwd,POCI_ERROR ErrHandler,unsigned int mode=OCI_ENV_DEFAULT);
    virtual ~BaseOCIDao();

    BOOL Connect(BaseOCIDao* parent);
    BOOL AddChildDao(BaseOCIDao* child);

    BOOL Connect();
    BOOL DisConnect();

    OCI_Resultset* QuerySql(const char* sql);
    BOOL ExecuteSql(const char* sql);
    OCI_Statement* PrepareBindStmt(const char* sql);
    OCI_Resultset* QueryBindStmt(OCI_Statement *stmt);
    BOOL ExecuteBindStmt(OCI_Statement *stmt);

    BOOL BeginTrans();
    BOOL EndTrans();
    BOOL Commit();
    BOOL Rollback();
};

BaseOCIDao.cpp文件

#include "StdAfx.h"
#include "BaseOCIDao.h"

BaseOCIDao::BaseOCIDao(string ip,unsigned int port,string inst,string user,string pwd,POCI_ERROR ErrHandler,unsigned int mode)
{
    m_ip = ip;
    m_port = port;
    m_inst = inst;
    m_user = user;
    m_pwd = pwd;
    m_mode = mode;
    m_ErrHandler = ErrHandler;
    m_ShareConn = false;    
    m_IsConnected = false;
    m_useTrans = false;
    
    m_stmt = NULL;
    m_conn = NULL;
}

BaseOCIDao::BaseOCIDao()
{
    m_ShareConn = false;    
    m_IsConnected = false;
    m_useTrans = false;

    m_stmt = NULL;
    m_conn = NULL;
}

BaseOCIDao::~BaseOCIDao()
{
    if(m_IsConnected && !m_ShareConn)
        DisConnect();
}

BOOL BaseOCIDao::Connect(BaseOCIDao* parent)
{
    m_ShareConn = true;
    return TRUE;
}

BOOL BaseOCIDao::Connect()
{
    m_ShareConn = false;

    /* Possible values for parameter mode:
    * - OCI_ENV_DEFAULT  : default mode
    * - OCI_ENV_THREADED : multi-threading support
    * - OCI_ENV_CONTEXT  : thread contextual error handling
    * - OCI_ENV_EVENTS   : enables events for subscription, HA Events, AQ notifications
    */
    
    /* INITIALIZE OCI ------------------------------------------------------- */
    if (!OCI_Initialize(m_ErrHandler, NULL, m_mode))//the Oracle library is loaded from system environment variables
        return EXIT_FAILURE;

    OCI_EnableWarnings(TRUE);
    /* CONNECTION TO SERVER ------------------------------------------------- */
    char dbs[100];
    sprintf_s(dbs,100,"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=%d)))(CONNECT_DATA=(SERVICE_NAME=%s)))",m_ip.c_str(),m_port,m_inst.c_str());
    m_conn = OCI_ConnectionCreate(dbs, m_user.c_str(), m_pwd.c_str(), OCI_SESSION_DEFAULT);
    if(m_conn!=NULL)
    {
        OCI_SetAutoCommit(m_conn,FALSE);
        m_IsConnected = true;

        for (vector<BaseOCIDao*>::iterator itr = m_Children.begin();
            itr!=m_Children.end(); itr++)
        {
            (*itr)->Connect(this);
        }

        return EXIT_SUCCESS;
    }
    else
    {
        print_ostr(OCI_ErrorGetString(OCI_GetLastError()));
        return EXIT_FAILURE;
    }
}

BOOL BaseOCIDao::DisConnect()
{
    if(m_conn!=NULL)
    {
        if(OCI_ConnectionFree(m_conn))
        {
            print_ostr(OCI_ErrorGetString(OCI_GetLastError()));
            OCI_Cleanup();
            return TRUE;
        }
        else
        {
            print_ostr(OCI_ErrorGetString(OCI_GetLastError()));
            return FALSE;
        }        
    }
    else
        return FALSE;
}

BOOL BaseOCIDao::AddChildDao(BaseOCIDao* child)
{
    if(child!=NULL)
        m_Children.push_back(child);
    return TRUE;
}


OCI_Statement* BaseOCIDao::PrepareBindStmt(const char* sql)
{
    if(!m_IsConnected) return NULL;
    m_stmt = OCI_StatementCreate(m_conn);
    OCI_Prepare(m_stmt,sql);
    return m_stmt;
}

OCI_Resultset* BaseOCIDao::QuerySql(const char* sql)
{
    if(!m_IsConnected) return NULL;
    m_stmt = OCI_StatementCreate(m_conn);
    OCI_ExecuteStmt(m_stmt,sql);
    return OCI_GetResultset(m_stmt);
}

OCI_Resultset* BaseOCIDao::QueryBindStmt(OCI_Statement *stmt)
{
    if(!m_IsConnected) return NULL;
    OCI_Execute(stmt);
    return OCI_GetResultset(stmt);
}

BOOL BaseOCIDao::ExecuteSql(const char* sql)
{
    if(!m_IsConnected) return FALSE;
    m_stmt = OCI_StatementCreate(m_conn);
    BOOL flag = OCI_ExecuteStmt(m_stmt,sql);
    if(!m_useTrans && !m_ShareConn)
    {
        if(flag)
            OCI_Commit(m_conn);
        else
            OCI_Rollback(m_conn);
    }
    return flag;
}

BOOL BaseOCIDao::ExecuteBindStmt(OCI_Statement *stmt)
{
    if(!m_IsConnected) return FALSE;
    BOOL flag = OCI_Execute(stmt);
    if(!m_useTrans && !m_ShareConn)
    {
        if(flag)
            OCI_Commit(m_conn);
        else
            OCI_Rollback(m_conn);
    }
    return flag;
}

BOOL BaseOCIDao::BeginTrans()
{
    if(!m_IsConnected) return FALSE;
    m_useTrans = true;
    return TRUE;
}

BOOL BaseOCIDao::EndTrans()
{
    if(!m_IsConnected || !m_useTrans) return FALSE;
    m_useTrans = false;
    return TRUE;
}

BOOL BaseOCIDao::Commit()
{
    if(!m_IsConnected || !m_useTrans) return FALSE;
    return OCI_Commit(m_conn);
}

BOOL BaseOCIDao::Rollback()
{
    if(!m_IsConnected || !m_useTrans) return FALSE;
    return OCI_Rollback(m_conn);
}

3.       继承实体类的使用

3.1 BaseModel定义

BaseModel

#pragma once
#include <string>
using namespace std;
class BaseModel{
public:
    BaseModel(){}
    virtual ~BaseModel(){}
};

3.2 例子

Model定义

#pragma once

#include "BaseModel.h"
#include <string>
using namespace std;

#define NameSize 100
class TDao;
class TModel : BaseModel{
    friend TDao;
protected:
    int m_ID;
    char m_Name[NameSize];
public:
    TModel(){
        m_ID = 0;
        memset(m_Name,0,NameSize);
    }
    TModel(const TModel& obj)
    {
        m_ID = obj.GetID();
        SetName(obj.GetName());
    }

    TModel& operator = (const TModel& obj)
    {
        if(this == &obj) return *this;
        m_ID = obj.GetID();
        return *this;
    }
    ~TModel()
    {

    }

    void SetID(int ID)
    {
        m_ID = ID;
    }

    int GetID() const
    {
        return m_ID;
    }
    void SetName(string Name)
    {
        strcpy_s(m_Name,NameSize,Name.c_str());
    }

    string GetName() const
    {
        return m_Name;
    }
};

 

Dao定义

#include "BaseOCIDao.h"
class TDao:BaseOCIDao
{
public:
    TDao(){}
    TDao(string ip,unsigned int port,string inst,string user,string pwd,POCI_ERROR ErrHandler,unsigned int mode):
    BaseOCIDao(ip,port,inst,user,pwd,ErrHandler,mode)
    {

    }
    ~TDao(){}

    BOOL Insert(TModel* model)
    {
        char* sql = "insert into TabName(id,name) values (:id,:name)";
        OCI_Statement* stmt = PrepareBindStmt(sql);

        OCI_BindInt(stmt,":id",&model->m_ID);
        OCI_BindString(stmt,":name",model->m_Name,NameSize);
        return ExecuteBindStmt(stmt);
    }

    BOOL Update(TModel* model)
    {
        char* sql = "update TabName set name=:name where id=:id";
        OCI_Statement* stmt = PrepareBindStmt(sql);

        OCI_BindInt(stmt,":id",&model->m_ID);
        OCI_BindString(stmt,":name",model->m_Name,NameSize);
        return ExecuteBindStmt(stmt);
    }

    BOOL Delete(string cond)
    {
        string sql = "delete from TabName";
        if(cond!="")
            sql+=" where " + cond;

        return ExecuteSql(sql.c_str());
    }

    vector<TModel*> Select(string cond)
    {
        vector<TModel*> resVec;
        string sql = "select id,name from TabName";
        if(cond!="")
            sql+=" where " + cond;

        OCI_Resultset* rs = QuerySql(sql.c_str());
        while(OCI_FetchNext(rs))
        {
            TModel *model = new TModel();
            model->SetID(OCI_GetInt(rs,1));
            model->SetName(OCI_GetString(rs,2));
            resVec.push_back(model);
        }
        return resVec;
    }

    BOOL Exist(TModel* model)
    {
        char* sql = "select id from TabName where name=:name";
        OCI_Statement* stmt = PrepareBindStmt(sql);
        OCI_BindString(stmt,":name",model->m_Name,NameSize);
        OCI_Resultset* rs = QueryBindStmt(stmt);
        if(OCI_FetchNext(rs))
        {
            model->SetID(OCI_GetInt(rs,1));
            return TRUE;
        }
        else
            return FALSE;
    }
};

DaoFactory定义

 
 
void err_handler(OCI_Error *err)
{
    int err_type = OCI_ErrorGetType(err); print_text("\n"); if (err_type == OCI_ERR_WARNING) { print_text("> WARNING : "); } else { print_text("> ERROR : "); } print_ostr(OCI_ErrorGetString(err)); print_text("\n"); }

class
DaoFactory{ private: string m_ip; unsigned int m_port; string m_inst; string m_user; string m_pwd; unsigned int m_mode; private: DaoFactory(){ m_ip = "127.0.0.1"; m_port = 1521; m_inst = "orcl"; m_user = "user"; m_pwd = "password"; m_mode = OCI_ENV_DEFAULT; } public: static DaoFactory* GetInstance() { static DaoFactory factory; return &factory; } ~DaoFactory(){} public: TDao* CreateTDao() { TDao* dao = new TDao(m_ip,m_port,m_inst,m_user,m_pwd,err_handler,m_mode); return dao; } };

简单情况

  1. 使用DaoFactory创建dao对象 dao
  2. 打开数据库连接 dao->Connect
  3. 执行搜索或增删改操作 dao->Select dao->Insert ….
  4. 关闭数据库连接 dao->DisConnect
  5. 删除dao对象 delete dao;

更复杂的情况

共享数据库连接进行查询

  1. 使用DaoFactory创建两个dao对象:DaoParent, DaoChild;
  2. DaoParent->AddChildDao(DaoChild);
  3. 打开数据库连接DaoParent->Connect();
  4. 搜索 DaoParent->Select();DaoChild->Select();
  5. 关闭数据库连接 DaoParent->DisConnect();
  6. 删除dao对象内存;delete DaoChild; delete DaoParent;

共享数据库事务,进行增删改操作

  1. 使用DaoFactory创建两个dao对象:DaoParent, DaoChild;
  2. DaoParent->AddChildDao(DaoChild);
  3. 打开数据库连接DaoParent->Connect();
  4. 打开事务 DaoParent-> BeginTrans
  5. 执行增删改操作 DaoParent->Insert();DaoChild->Update();。。。
  6. 提交或回滚事务 DaoParent-> Commit DaoParent-> Rollback
  7. 关闭事务 DaoParent-> EndTrans
  8. 关闭数据库连接 DaoParent->DisConnect();
  9. 删除dao对象内存;delete DaoChild; delete DaoParent;

 

4.       自动生成Model和Dao的工具设计

工具从输入流中读入一组规定格式的数据,按照此数据构建Model和Dao类代码。

 

输入内容格式规定

类名

数据库表名

字段个数N

字段1 类型1 数据库字段名1

字段N 类型N 数据库字段名N

 

支持的类型

类型

真实类型

数据库对应类型

int

int

number(10)

unsigned int

unsigned int

number(10)

short

short

number(5)

unsigned short

unsigned short

number(5)

float

float

binary_float

double

double

binary_double

string

char[]

varchar2()

big_int

long long

number(14)

big_uint

unsigned long long

number(14)

 

例子:

User类有3个字段,IDNamePwd

可输入如下:

User

UserTable

3

ID unsigned int ID

Name string Name

Pwd string Pwd

 

自动生成工具根据BaseMode和BaseOCIDao生成,可根据需要将生成后的Model和Dao进行修改。对于stirng类型的数据,自动生成Model后,可修改xxxSize宏,设置string类型字段的长度。

自动生成Model和Dao的工具AutoGenModelDao

AutoGenModelDao.h

#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

typedef struct FieldType
{
    string Field;
    string FType;//string,int,unsigned int, short,unsigned short,float,double,big_int,big_uint
    string DBField;
    friend istream& operator >> (istream& myin,FieldType& obj)
    {
        myin>>obj.Field;
        myin>>obj.FType;
        if(obj.FType=="unsigned")
        {
            string tmp;
            myin>>tmp;
            obj.FType = obj.FType+" "+tmp;
        }
        myin>>obj.DBField;
        return myin;
    }
}FieldType;

class AutoGenModelDao
{
private:
    string m_ModelClass;
    string m_DaoClass;
    string m_DBTable;
    string m_OutputDir;
    vector<FieldType> m_Fields;
public:
    AutoGenModelDao();
    ~AutoGenModelDao();

    void AutoGen(istream& myin);
private:
    void GenModelHeader();
    ostream& GenConstructFun(ostream& myout);
    ostream& GenGetSetFun(ostream& myout);
    void GenModelBody();
private:
    void GenDaoHeader();
    void GenDaoBody();
    ostream& GenInsertFun(ostream& myout);
    ostream& GenInsertBatchFun(ostream& myout);
    ostream& GenUpdateFun(ostream& myout);
    ostream& GenUpdateBatchFun(ostream& myout);
    ostream& GenDeleteFun(ostream& myout);
    ostream& GenSelectFun(ostream& myout);
    ostream& GenExistFun(ostream& myout);
};

 

AutoGenModelDao.cpp

#include "StdAfx.h"
#include "AutoGenModelDao.h"
#include <iostream>
#include <fstream>
using namespace std;

AutoGenModelDao::AutoGenModelDao(void)
{
}


AutoGenModelDao::~AutoGenModelDao(void)
{
}

void AutoGenModelDao::AutoGen(istream& myin)
{
    m_OutputDir = "..\\output";
    string className;
    myin>>className;//ClassName
    m_ModelClass = className+"Model";
    m_DaoClass = className+"Dao";    
    myin>>m_DBTable;
    int fieldLen;
    myin>>fieldLen;
    m_Fields.clear();
    for (int i=0;i<fieldLen;i++)
    {
        FieldType field;
        myin>>field;
        m_Fields.push_back(field);
    }

    GenModelHeader();
    GenModelBody();
    GenDaoHeader();
    GenDaoBody();
}

void AutoGenModelDao::GenModelHeader()
{
    int strsize = 100;
    string file = m_OutputDir+"\\"+m_ModelClass+".h";
    ofstream myout(file.c_str(),ios::out);
    myout<<"#pragma once"<<endl;
    myout<<"#include \"BaseModel.h\""<<endl;
    myout<<"#include <string>"<<endl;
    myout<<"using namespace std;"<<endl;
    
    myout<<endl;
    //build #define string size
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType == "string")
            myout<<"#define "<<itr->Field<<"Size "<<strsize<<endl;
    }
    myout<<endl;
    myout<<"class "<<m_DaoClass<<";"<<endl;
    myout<<"class "<<m_ModelClass<<" : BaseModel{"<<endl;
    myout<<"friend "<<m_DaoClass<<";"<<endl;
    
    myout<<"protected:"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType == "string")
            myout<<"\t    char m_"<<itr->Field<<"["<<itr->Field<<"Size];"<<endl;
        else
            myout<<"\t    "<<itr->FType<<" m_"<<itr->Field<<";"<<endl;
    }
    myout<<endl;

    myout<<"public:"<<endl;
    myout<<"\t    "<<m_ModelClass<<"();"<<endl;
    myout<<"\t    ~"<<m_ModelClass<<"();"<<endl;
    myout<<"\t    "<<m_ModelClass<<"(const "<<m_ModelClass<<"& obj);"<<endl;
    myout<<"\t    "<<m_ModelClass<<"& operator = (const "<<m_ModelClass<<"& obj);"<<endl;
    
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<"\t    void Set"<<itr->Field<<"("<<itr->FType<<" val);"<<endl;
        myout<<"\t    "<<itr->FType<<" Get"<<itr->Field<<"() const;"<<endl;
    }

    myout<<"};"<<endl;
    myout.close();
}

void AutoGenModelDao::GenModelBody()
{
    string file = m_OutputDir+"\\"+m_ModelClass+".cpp";
    ofstream myout(file.c_str(),ios::out);
    myout<<"#include \"StdAfx.h\""<<endl;
    myout<<"#include \""<<m_ModelClass<<".h\""<<endl;
    GenConstructFun(myout);
    GenGetSetFun(myout);
    myout.close();
}
ostream& AutoGenModelDao::GenConstructFun(ostream& myout)
{
    myout<<m_ModelClass<<"::"<<m_ModelClass<<"(){"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType!="string")
            myout<<"\t    m_"<<itr->Field<<" = 0;"<<endl;
        else
            myout<<"\t    memset(m_"<<itr->Field<<",0,"<<itr->Field<<"Size);m_"<<itr->Field<<"[0]='\\0';"<<endl;
    }
    myout<<"}"<<endl;
    myout<<endl;
    myout<<m_ModelClass<<"::~"<<m_ModelClass<<"(){}"<<endl;
    myout<<endl;
    myout<<m_ModelClass<<"::"<<m_ModelClass<<"(const "<<m_ModelClass<<"& obj){"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType!="string")
            myout<<"\t    m_"<<itr->Field<<" = obj.Get"<<itr->Field<<"();"<<endl;
        else
            myout<<"\t    Set"<<itr->Field<<"(obj.Get"<<itr->Field<<"());"<<endl;
    }
    myout<<"}"<<endl;
    myout<<endl;
    myout<<m_ModelClass<<"& "<<m_ModelClass<<"::operator = (const "<<m_ModelClass<<"& obj){"<<endl;
    myout<<"\t    if(this == &obj) return *this;"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType!="string")
            myout<<"\t    m_"<<itr->Field<<" = obj.Get"<<itr->Field<<"();"<<endl;
        else
            myout<<"\t    Set"<<itr->Field<<"(obj.Get"<<itr->Field<<"());"<<endl;
    }
    myout<<"\t    return *this;"<<endl;
    myout<<"}"<<endl;
    return myout;
}
ostream& AutoGenModelDao::GenGetSetFun(ostream& myout)
{
    myout<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<"void "<<m_ModelClass<<"::Set"<<itr->Field<<"("<<itr->FType<<" val){"<<endl;
        if(itr->FType != "string")
            myout<<"\t    m_"<<itr->Field<<" = val;"<<endl;
        else
            myout<<"\t    strcpy_s(m_"<<itr->Field<<","<<itr->Field<<"Size,val.c_str());"<<endl;
        myout<<"}"<<endl;
        myout<<endl;

        myout<<itr->FType<<" "<<m_ModelClass<<"::Get"<<itr->Field<<"()const{"<<endl;
        myout<<"\t    return m_"<<itr->Field<<";"<<endl;
        myout<<"}"<<endl;
    }
    return myout;
}
void AutoGenModelDao::GenDaoHeader()
{
    string file = m_OutputDir+"\\"+m_DaoClass+".h";
    ofstream myout(file.c_str(),ios::out);
    myout<<"#pragma once"<<endl;
    myout<<"#include \""<<m_ModelClass<<".h\""<<endl;
    myout<<"#include \"BaseOCIDao.h\""<<endl;
    myout<<"#include <string>"<<endl;
    myout<<"#include <vector>"<<endl;
    myout<<"using namespace std;"<<endl;
    myout<<endl;
    myout<<"class "<<m_DaoClass<<" : BaseOCIDao{"<<endl;
    myout<<"public:"<<endl;
    myout<<"\t    "<<m_DaoClass<<"():BaseOCIDao(){}"<<endl;
    myout<<"\t    "<<m_DaoClass<<"(string ip,unsigned int port,string inst,string user,string pwd,POCI_ERROR ErrHandler,unsigned int mode):BaseOCIDao(ip,port,inst,user,pwd,ErrHandler,mode){}"<<endl;
    myout<<"\t    ~"<<m_DaoClass<<"(){}"<<endl;
    myout<<"\t    BOOL Insert("<<m_ModelClass<<"* model);"<<endl;
    myout<<"\t    BOOL InsertBatch(vector<"<<m_ModelClass<<"*> models);"<<endl;
    myout<<"\t    BOOL Update("<<m_ModelClass<<"* model);"<<endl;
    myout<<"\t    BOOL UpdateBatch(vector<"<<m_ModelClass<<"*> models);"<<endl;
    myout<<"\t    BOOL Exist("<<m_ModelClass<<"* model);"<<endl;
    myout<<"\t    BOOL Delete(string cond);"<<endl;
    myout<<"\t    vector<"<<m_ModelClass<<"*> Select(string cond);"<<endl;
    myout<<"};"<<endl;
    myout.close();
}

void AutoGenModelDao::GenDaoBody()
{
    string file = m_OutputDir+"\\"+m_DaoClass+".cpp";
    ofstream myout(file.c_str(),ios::out);
    myout<<"#include \"StdAfx.h\""<<endl;
    myout<<"#include \""<<m_ModelClass<<".h\""<<endl;
    myout<<"#include \""<<m_DaoClass<<".h\""<<endl;
    myout<<endl;
    GenInsertFun(myout);
    GenInsertBatchFun(myout);
    GenUpdateFun(myout);
    GenUpdateBatchFun(myout);
    GenDeleteFun(myout);
    GenSelectFun(myout);
    GenExistFun(myout);
    myout.close();
}
ostream& AutoGenModelDao::GenInsertFun(ostream& myout)
{
    myout<<endl;
    myout<<"BOOL "<<m_DaoClass<<"::Insert("<<m_ModelClass<<"* model){"<<endl;
    myout<<"\t    if(model==NULL)return FALSE;"<<endl;
    myout<<"\t    char* sql=\"insert into "<<m_DBTable<<"(";
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<itr->DBField;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<") values (";
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<":"<<itr->Field;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<")\";"<<endl;    
    myout<<endl;

    myout<<"\t    OCI_Statement* stmt = PrepareBindStmt(sql);"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType=="int")
            myout<<"\t    OCI_BindInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "unsigned int")
            myout<<"\t    OCI_BindUnsignedInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "short")
            myout<<"\t    OCI_BindShort(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "unsigned short")
            myout<<"\t    OCI_BindUnsignedShort(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "float")
            myout<<"\t    OCI_BindFloat(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "double")
            myout<<"\t    OCI_BindDouble(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "big_int")
            myout<<"\t    OCI_BindBigInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "big_uint")
            myout<<"\t    OCI_BindUnsignedBigInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "string")
            myout<<"\t    OCI_BindString(stmt,\":"<<itr->Field<<"\",model->m_"<<itr->Field<<","<<itr->Field<<"Size);"<<endl;
    }
    myout<<"\t    return ExecuteBindStmt(stmt);"<<endl;
    myout<<"}"<<endl;
    return myout;
}

ostream& AutoGenModelDao::GenInsertBatchFun(ostream& myout)
{
    myout<<endl;
    myout<<"BOOL "<<m_DaoClass<<"::InsertBatch(vector<"<<m_ModelClass<<"*> models){"<<endl;
    myout<<"\t    if(models.empty())return FALSE;"<<endl;
    myout<<"\t    char* sql=\"insert into "<<m_DBTable<<"(";
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<itr->DBField;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<") values (";
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<":"<<itr->Field;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<")\";"<<endl;    
    myout<<endl;

    myout<<"\t    OCI_Statement* stmt = PrepareBindStmt(sql);"<<endl;
    myout<<"\t    int bindSize=models.size();"<<endl;
    myout<<"\t    int strOffset=0;"<<endl;
    myout<<"\t    OCI_BindArraySetSize(stmt, bindSize);"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType=="int")
        {
            myout<<"\t    int* t"<<itr->Field<<"Arr = new int[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "unsigned int")
        {
            myout<<"\t    unsigned int* t"<<itr->Field<<"Arr = new unsigned int[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfUnsignedInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "short")
        {
            myout<<"\t    short* t"<<itr->Field<<"Arr = new short[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfShorts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "unsigned short")
        {
            myout<<"\t    unsigned short* t"<<itr->Field<<"Arr = new unsigned short[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfUnsignedShorts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "float")
        {
            myout<<"\t    float* t"<<itr->Field<<"Arr = new float[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfFloats(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "double")
        {
            myout<<"\t    double* t"<<itr->Field<<"Arr = new double[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfDoubles(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "big_int")
        {
            myout<<"\t    big_int* t"<<itr->Field<<"Arr = new big_int[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfBigInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "big_uint")
        {
            myout<<"\t    big_uint* t"<<itr->Field<<"Arr = new big_uint[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfUnsignedBigInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "string")
        {
            myout<<"\t    strOffset=0;"<<endl;
            myout<<"\t    char* t"<<itr->Field<<"Arr = new char["<<itr->Field<<"Size*bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        strcpy_s(t"<<itr->Field<<"Arr+strOffset,"<<itr->Field<<"Size,models[i]->m_"<<itr->Field<<");"<<endl;
            myout<<"\t        strOffset+="<<itr->Field<<"Size;"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfStrings(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,"<<itr->Field<<"Size-1,bindSize);"<<endl<<endl;
        }
    }
    myout<<"\t    BOOL flag = ExecuteBindStmt(stmt);"<<endl<<endl;
    
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<"\t    delete[] t"<<itr->Field<<"Arr;"<<endl;
    }
    myout<<endl<<"\t    return flag;"<<endl;
    myout<<"}"<<endl;
    return myout;
}

ostream& AutoGenModelDao::GenUpdateFun(ostream& myout)
{
    myout<<endl;
    myout<<"BOOL "<<m_DaoClass<<"::Update("<<m_ModelClass<<"* model){"<<endl;
    myout<<"\t    if(model==NULL)return FALSE;"<<endl;
    myout<<"\t    char* sql=\"update "<<m_DBTable<<" set ";
    vector<FieldType>::iterator itr = m_Fields.begin();
    itr++;
    for (;itr != m_Fields.end(); itr++)
    {
        myout<<itr->DBField<<" = :"<<itr->Field;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<" where "<<m_Fields.begin()->DBField<<"=:"<<m_Fields.begin()->Field<<"\";"<<endl;    
    myout<<endl;
    
    myout<<"\t    OCI_Statement* stmt = PrepareBindStmt(sql);"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType=="int")
            myout<<"\t    OCI_BindInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "unsigned int")
            myout<<"\t    OCI_BindUnsignedInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "short")
            myout<<"\t    OCI_BindShort(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "unsigned short")
            myout<<"\t    OCI_BindUnsignedShort(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "float")
            myout<<"\t    OCI_BindFloat(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "double")
            myout<<"\t    OCI_BindDouble(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "big_int")
            myout<<"\t    OCI_BindBigInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "big_uint")
            myout<<"\t    OCI_BindUnsignedBigInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "string")
            myout<<"\t    OCI_BindString(stmt,\":"<<itr->Field<<"\",model->m_"<<itr->Field<<","<<itr->Field<<"Size);"<<endl;
    }

    myout<<"\t    return ExecuteBindStmt(stmt);"<<endl;
    myout<<"}"<<endl;
    return myout;
}

ostream& AutoGenModelDao::GenUpdateBatchFun(ostream& myout)
{
    myout<<endl;
    myout<<"BOOL "<<m_DaoClass<<"::UpdateBatch(vector<"<<m_ModelClass<<"*> models){"<<endl;
    myout<<"\t    if(models.empty())return FALSE;"<<endl;
    myout<<"\t    char* sql=\"update "<<m_DBTable<<" set ";
    vector<FieldType>::iterator itr = m_Fields.begin();
    itr++;
    for (;itr != m_Fields.end(); itr++)
    {
        myout<<itr->DBField<<" = :"<<itr->Field;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<" where "<<m_Fields.begin()->DBField<<"=:"<<m_Fields.begin()->Field<<"\";"<<endl;    
    myout<<endl;

    myout<<"\t    OCI_Statement* stmt = PrepareBindStmt(sql);"<<endl;
    myout<<"\t    int bindSize=models.size();"<<endl;
    myout<<"\t    int strOffset=0;"<<endl;
    myout<<"\t    OCI_BindArraySetSize(stmt, bindSize);"<<endl;
    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        if(itr->FType=="int")
        {
            myout<<"\t    int* t"<<itr->Field<<"Arr = new int[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "unsigned int")
        {
            myout<<"\t    unsigned int* t"<<itr->Field<<"Arr = new unsigned int[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfUnsignedInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "short")
        {
            myout<<"\t    short* t"<<itr->Field<<"Arr = new short[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfShorts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "unsigned short")
        {
            myout<<"\t    unsigned short* t"<<itr->Field<<"Arr = new unsigned short[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfUnsignedShorts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "float")
        {
            myout<<"\t    float* t"<<itr->Field<<"Arr = new float[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfFloats(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "double")
        {
            myout<<"\t    double* t"<<itr->Field<<"Arr = new double[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfDoubles(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "big_int")
        {
            myout<<"\t    big_int* t"<<itr->Field<<"Arr = new big_int[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfBigInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "big_uint")
        {
            myout<<"\t    big_uint* t"<<itr->Field<<"Arr = new big_uint[bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        t"<<itr->Field<<"Arr[i]=models[i]->m_"<<itr->Field<<";"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfUnsignedBigInts(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,bindSize);"<<endl<<endl;
        }
        else if(itr->FType == "string")
        {
            myout<<"\t    strOffset=0;"<<endl;
            myout<<"\t    char* t"<<itr->Field<<"Arr = new char["<<itr->Field<<"Size*bindSize];"<<endl;
            myout<<"\t    for(int i=0;i<bindSize;++i){"<<endl;
            myout<<"\t        strcpy_s(t"<<itr->Field<<"Arr+strOffset,"<<itr->Field<<"Size,models[i]->m_"<<itr->Field<<");"<<endl;
            myout<<"\t        strOffset+="<<itr->Field<<"Size;"<<endl;
            myout<<"\t    }"<<endl;
            myout<<"\t    OCI_BindArrayOfStrings(stmt,\":"<<itr->Field<<"\",t"<<itr->Field<<"Arr,"<<itr->Field<<"Size-1,bindSize);"<<endl<<endl;
        }
    }

    myout<<"\t    BOOL flag = ExecuteBindStmt(stmt);"<<endl<<endl;

    for (vector<FieldType>::iterator itr = m_Fields.begin();
        itr != m_Fields.end(); itr++)
    {
        myout<<"\t    delete[] t"<<itr->Field<<"Arr;"<<endl;
    }
    myout<<endl<<"\t    return flag;"<<endl;
    myout<<"}"<<endl;
    return myout;
}

ostream& AutoGenModelDao::GenDeleteFun(ostream& myout)
{
    myout<<endl;
    myout<<"BOOL "<<m_DaoClass<<"::Delete(string cond){"<<endl;
    myout<<"\t    string sql=\"delete from "<<m_DBTable<<"\";"<<endl;
    myout<<"\t    if(cond!=\"\") sql+=\" where \"+cond;"<<endl;
    myout<<"\t    return ExecuteSql(sql.c_str());"<<endl;
    myout<<"}"<<endl;
    return myout;
}

ostream& AutoGenModelDao::GenSelectFun(ostream& myout)
{
    myout<<endl;
    myout<<"vector<"<<m_ModelClass<<"*> "<<m_DaoClass<<"::Select(string cond){"<<endl;
    myout<<"\t    vector<"<<m_ModelClass<<"*> resVec;"<<endl;
    myout<<"\t    string sql=\"select ";
    vector<FieldType>::iterator itr = m_Fields.begin();
    for (;itr != m_Fields.end(); itr++)
    {
        myout<<itr->DBField;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<" from "<<m_DBTable<<"\";"<<endl;
    myout<<"\t    if(cond!=\"\") sql+=\" where \"+cond;"<<endl;
    myout<<"\t    OCI_Resultset* rs = QuerySql(sql.c_str());"<<endl;
    myout<<"\t    while(OCI_FetchNext(rs)){"<<endl;
    myout<<"\t        "<<m_ModelClass<<"* model = new "<<m_ModelClass<<"();"<<endl;
    
    int fieldCnt = 0;
    for (itr=m_Fields.begin();itr != m_Fields.end(); itr++)
    {
        fieldCnt++;
        myout<<"\t        model->Set"<<itr->Field<<"(";
        if(itr->FType=="int")
            myout<<"OCI_GetInt(rs,"<<fieldCnt<<")";
        else if(itr->FType == "unsigned int")
            myout<<"OCI_GetUnsignedInt(rs,"<<fieldCnt<<")";
        else if(itr->FType == "short")
            myout<<"OCI_BindShort(rs,"<<fieldCnt<<")";
        else if(itr->FType == "unsigned short")
            myout<<"OCI_GetUnsignedShort(rs,"<<fieldCnt<<")";
        else if(itr->FType == "float")
            myout<<"OCI_GetFloat(rs,"<<fieldCnt<<")";
        else if(itr->FType == "double")
            myout<<"OCI_BindDouble(rs,"<<fieldCnt<<")";
        else if(itr->FType == "big_int")
            myout<<"OCI_GetBigInt(rs,"<<fieldCnt<<")";
        else if(itr->FType == "big_uint")
            myout<<"OCI_GetUnsignedBigInt(rs,"<<fieldCnt<<")";
        else if(itr->FType == "string")
            myout<<"OCI_GetString(rs,"<<fieldCnt<<")";

        myout<<");"<<endl;
    }
    myout<<"\t        resVec.push_back(model);"<<endl;
    myout<<"\t    }"<<endl;
    myout<<"\t    return resVec;"<<endl;
    myout<<"}"<<endl;
    return myout;
}
ostream& AutoGenModelDao::GenExistFun(ostream& myout)
{
    myout<<endl;
    myout<<"BOOL "<<m_DaoClass<<"::Exist("<<m_ModelClass<<"* model){"<<endl;
    myout<<"\t    if(model==NULL) return FALSE;"<<endl;
    vector<FieldType>::iterator itr = m_Fields.begin();
    myout<<"\t    char* sql=\"select "<<itr->DBField<<" from "<<m_DBTable<<" where ";
    itr++;
    for (;itr != m_Fields.end(); itr++)
    {
        myout<<itr->DBField<<" = :"<<itr->Field;
        if(itr+1 != m_Fields.end())
            myout<<",";
    }
    myout<<"\";"<<endl;

    myout<<"\t    OCI_Statement* stmt = PrepareBindStmt(sql);"<<endl;
    itr = m_Fields.begin();
    itr++;
    for (;itr != m_Fields.end(); itr++)
    {
        if(itr->FType=="int")
            myout<<"\t    OCI_BindInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "unsigned int")
            myout<<"\t    OCI_BindUnsignedInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "short")
            myout<<"\t    OCI_BindShort(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "unsigned short")
            myout<<"\t    OCI_BindUnsignedShort(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "float")
            myout<<"\t    OCI_BindFloat(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "double")
            myout<<"\t    OCI_BindDouble(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "big_int")
            myout<<"\t    OCI_BindBigInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "big_uint")
            myout<<"\t    OCI_BindUnsignedBigInt(stmt,\":"<<itr->Field<<"\",&model->m_"<<itr->Field<<");"<<endl;
        else if(itr->FType == "string")
            myout<<"\t    OCI_BindString(stmt,\":"<<itr->Field<<"\",model->m_"<<itr->Field<<","<<itr->Field<<"Size);"<<endl;
    }
    myout<<"\t    OCI_Resultset* rs = QueryBindStmt(stmt);"<<endl;
    myout<<"\t    if(OCI_FetchNext(rs)){"<<endl;
    myout<<"\t        model->Set"<<m_Fields.begin()->Field<<"(OCI_GetUnsignedInt(rs,1));"<<endl;
    myout<<"\t        return TRUE;"<<endl;
    myout<<"\t    }"<<endl;
    myout<<"\t    else return FALSE;"<<endl;
    myout<<"}"<<endl;
    return myout;
}

 

 

点我下载上述例子及自动生成Model和Dao的代码