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

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

1.       类图

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个字段,ID,Name,Pwd

可输入如下:

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的代码

posted @ 2016-01-31 00:47  小小鸟的大梦想  阅读(2065)  评论(0)    收藏  举报