⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tinyoci.cpp

📁 一个Oracle OCI编程接的C++封装
💻 CPP
📖 第 1 页 / 共 3 页
字号:
Date         :
Revision     :
***************************************************************************M*/
bool TinyOci::CleanDefineBuffer( void )
{
    int i;
    TinyNamedPtrList* pDefineList;
    TinyItem *pTinyItem;

    pDefineList = CurrentDefineList( );
    if( NULL == pDefineList )
        return false;

    for( i=0; i<pDefineList->GetCount(); i++ )
    {        
        pTinyItem = (TinyItem *)pDefineList->GetAt(i);
        if( NULL != pTinyItem->pValueArray )
        {
            memset( pTinyItem->pValueArray, 0, m_lMaxFetch * pTinyItem->lSize );         
        }
        if( NULL != pTinyItem->IndicatorArray )
        {         
            memset( pTinyItem->IndicatorArray, 0, m_lMaxFetch * sizeof( sb2 ) );
        }
    }

    return true;
}


/*M***************************************************************************
Method Name  : TinyOci::Fetch
            
Return       : TINYOCI_FETCH_ERROR 
               TINYOCI_FETCH_DONE   -> 取了一批数据  
               TINYOCI_FETCH_MORE   -> 取了一批数据              
               TINYOCI_FETCH_NODATA
                                             
Process      :
Note         : 
   
Author       : 
Date         :
Revision     :
***************************************************************************M*/
short TinyOci::Fetch( long &lRows )
{
    short rc;
    ub4   lRowCountSoFar;
    sword Status;

    if( !IsSelect() )
        return TINYOCI_FETCH_ERROR;

    lRows = 0;
    rc    = TINYOCI_FETCH_DONE;
        
    // 清除前一次FETCH得到的数据
    if( !CleanDefineBuffer() )
        return TINYOCI_FETCH_ERROR;

    m_Status = OCIStmtFetch( m_phStmtHandle, 
                             m_phErrorHandle,// Notes:
                             m_lMaxFetch,                                           
                             OCI_FETCH_NEXT,
                             OCI_DEFAULT );
    if( ( OCI_SUCCESS           != m_Status ) && 
        ( OCI_SUCCESS_WITH_INFO != m_Status ) &&
        ( OCI_NO_DATA           != m_Status ) )
        return TINYOCI_FETCH_ERROR;

    Status = OCIAttrGet( (dvoid *)m_phStmtHandle, 
                         (ub4)OCI_HTYPE_STMT, 
                         (dvoid *) &lRowCountSoFar, 
                         (ub4 *) 0, 
                         (ub4)OCI_ATTR_ROW_COUNT, 
                         m_phErrorHandle ); 
    if( OCI_SUCCESS != Status )
    {
        m_Status = Status;
        return TINYOCI_FETCH_ERROR;
    }
        
    switch( m_Status )
    {
    case OCI_NO_DATA:
        rc = TINYOCI_FETCH_NODATA;

        // 也有可能是最后一批数据                
        m_lRowFetched    = lRowCountSoFar - m_lRowCountSoFar;
        m_lRowCountSoFar = lRowCountSoFar;        
        if( m_lRowFetched > 0 )
            rc = TINYOCI_FETCH_DONE;
        break;

    case OCI_SUCCESS:
    case OCI_SUCCESS_WITH_INFO:
        rc = TINYOCI_FETCH_MORE;
        
        // 也有可能是最后一批数据                
        m_lRowFetched    = lRowCountSoFar - m_lRowCountSoFar;
        m_lRowCountSoFar = lRowCountSoFar;                           
        if( m_lRowFetched < m_lMaxFetch )
            rc = TINYOCI_FETCH_DONE;
        break;
    }

    lRows = m_lRowFetched;
    return rc;
}


short TinyOci::Fetch( CMXList< CMXList<CMXString> > &RowsList )
{
    long  i;
    short f;
    long  lRows;
    short rc;
    TinyNamedPtrList *pDefineList;
    CMXList<CMXString> *pFieldsList;
    CMXString *pstrField;
    TinyItem *pTinyItem;
    char szField[128];

    rc = Fetch( lRows );
    switch( rc )
    {
    case TINYOCI_FETCH_ERROR:
    case TINYOCI_FETCH_NODATA:
        break;

    case TINYOCI_FETCH_DONE:
    case TINYOCI_FETCH_MORE:        
        if( NULL == (pDefineList = CurrentDefineList()) )
            return TINYOCI_FETCH_ERROR;

        for( i=0; i<lRows; i++ )
        {
            pFieldsList = new CMXList<CMXString>;
            for( f=0; f<pDefineList->GetCount(); f++ )
            {
                // 把每一个字段转换成字符串,并添加到pFieldsList;
                // 检查每一个字段是否为空值。空字符串可以用来表示“空值”。
                pTinyItem = (TinyItem *)pDefineList->GetAt(f);                                
                switch( pTinyItem->nType )
                {
                case SQLT_FLT:// - double
                    if( -1 == pTinyItem->IndicatorArray[i] )
                        //strcpy( szField, "<NULL>" );
                        szField[0] = 0;
                    else
                        sprintf( szField, "%.5f", ((double*)pTinyItem->pValueArray)[i] );
                    pstrField = new CMXString( (const char*)szField );
                    break;

                case SQLT_INT:// - long
                    if( -1 == pTinyItem->IndicatorArray[i] )
                        //strcpy( szField, "<NULL>" );
                        szField[0] = 0;
                    else
                        sprintf( szField, "%ld", ((long*)pTinyItem->pValueArray)[i] );
                    pstrField = new CMXString( (const char*)szField );
                    break;

                case SQLT_STR:// - sz char                    
                    if( ( -1 == pTinyItem->IndicatorArray[i] ) ||
                        ((((const char*)pTinyItem->pValueArray) + i*pTinyItem->lSize)[0] == 0) )
                        pstrField = new CMXString( (const char*)"" );                    
                    else
                        pstrField = new CMXString( ((const char*)pTinyItem->pValueArray) + i*pTinyItem->lSize );
                    break;

                default:
                    return TINYOCI_FETCH_ERROR;
                    //break;
                }
                
                // 取得一个字段
                pFieldsList->AddTail( pstrField );
            }

            // 取得一条记录
            RowsList.AddTail( pFieldsList );
        }
        break;
    }

    return rc;
}

/*M***************************************************************************
Method Name  : TinyOci::CurrentDefineList
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
TinyNamedPtrList* TinyOci::CurrentDefineList( void )
{
    if( DescDefineNameList.GetCount() > 0 )
        return &DescDefineNameList;
    else if( DefineNameList.GetCount() > 0 )
        return &DefineNameList;
    else 
        return (TinyNamedPtrList*)NULL;    
}

/*M***************************************************************************
Method Name  : TinyOci::CheckNull
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
void TinyOci::CheckNull( void )
{
}

/*M***************************************************************************
Method Name  : TinyOci::SetPrefetch
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool  TinyOci::SetPrefetch( long lPrefetch )
{
    m_lPrefetch = lPrefetch;
    return true;
}

/*M***************************************************************************
Method Name  : TinyOci::SetMaxFetch
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool  TinyOci::SetMaxFetch( long lMaxFetch )
{
    m_lMaxFetch = (lMaxFetch > TINYOCI_MAXFETCH) ? TINYOCI_MAXFETCH:lMaxFetch;
    return true;
}

/*M***************************************************************************
Method Name  : TinyOci::IsCommBreak
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool TinyOci::IsCommBreak( void )
{
    sb4 aErrCode[] = 
    {
        TINYOCI_CONNECTION_BROKEN,
        TINYOCI_SESSION_KILLED,   
        TINYOCI_IVALID_SESSION,   
        TINYOCI_EOF_COMM_CHANNEL 
    };
    sb4 ErrorCode;
    int nItem;
    int i;

    ErrorCode = GetError( NULL );    
    nItem     = sizeof( aErrCode )/sizeof( aErrCode[0] );
    for( i=0; i<nItem; i++ )
    {
        if( ErrorCode == aErrCode[i] )
            return true;
    }

    return false;
}

/*M***************************************************************************
Method Name  : TinyOci::PushBindList
            
Return       :                
Process      :
Note         : IndicatorArray allocation is defered !
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool TinyOci::PushBindList( const char *pszName, ub2 DataType, long lSize, void *pValue )
{
    TinyItem *p;
    
    p = new TinyItem;
    strcpy( p->szName, pszName );
    p->nType          = DataType;
    p->lSize          = lSize;
    p->pValueArray    = pValue;
    p->IndicatorArray =  NULL; // Defered

    return BindNameList.Append( pszName, p );
}

/*M***************************************************************************
Method Name  : TinyOci::PushDefineList
            
Return       :                
Process      :
Note         : IndicatorArray allocation is defered !
               
               DataType只能取以下的值:
               SQLT_FLT
               SQLT_INT
               SQLT_STR
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool TinyOci::PushDefineList( const char *pszName, ub2 DataType, long lSize, void *pValue )
{
    bool bRc = false;
    TinyItem *p;
    
    switch( DataType )
    {
    case SQLT_FLT:
    case SQLT_INT:
    case SQLT_STR:
        p = new TinyItem;
        strcpy( p->szName, pszName );
        p->nType          = DataType;
        p->lSize          = lSize;
        p->pValueArray    = pValue;
        p->IndicatorArray =  NULL; // Defered
        
        bRc = DefineNameList.Append( p->szName, p );
        break;

    default:
        bRc = false;
        break;
    }
    
    return bRc;
}

/*M***************************************************************************
Method Name  : TinyOci::CleanBindList,CleanDefineList
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool TinyOci::CleanBindList( void )
{
    TinyItem *pTinyItem;
    int i;

    for(i=0; i<BindNameList.GetCount(); i++ )
    {
        pTinyItem = (TinyItem *)BindNameList.GetAt(i);
        if( NULL != pTinyItem->IndicatorArray )
        {
            delete [] pTinyItem->IndicatorArray;
            pTinyItem->IndicatorArray = NULL;
        }
        delete pTinyItem;
    }

    BindNameList.Clean();    
    return true;
}

bool TinyOci::CleanDefineList( void )
{
    TinyItem *pTinyItem;
    int i;

    for(i=0; i<DefineNameList.GetCount(); i++ )
    {
        pTinyItem = (TinyItem *)DefineNameList.GetAt(i);
        if( NULL != pTinyItem->IndicatorArray )
        {
            delete [] pTinyItem->IndicatorArray;
            pTinyItem->IndicatorArray = NULL;
        }
        delete pTinyItem;
    }
    
    DefineNameList.Clean();
    return true;
}

bool TinyOci::CleanDescDefineList( void )
{
    TinyItem *pTinyItem;
    int i;

    for(i=0; i<DescDefineNameList.GetCount(); i++ )
    {
        pTinyItem = (TinyItem *)DescDefineNameList.GetAt(i);
        if( NULL != pTinyItem->IndicatorArray )
        {            
            delete [] (char*)(pTinyItem->IndicatorArray);
            pTinyItem->IndicatorArray = NULL;
        }

        if( NULL != pTinyItem->pValueArray )
        {            
            delete [] (char*)(pTinyItem->pValueArray);
            pTinyItem->pValueArray = NULL;
        }

        delete pTinyItem;
    }
    
    DescDefineNameList.Clean();
    return true;
}

bool TinyOci::ResetList( void )
{
    return ( CleanBindList() &&
             CleanDefineList() &&
             CleanDescDefineList()
           );
}

/*M***************************************************************************
Method Name  : TinyOci::SetDateFormat
            
Return       :                
Process      :
Note         : 
Author       : 
Date         :
Revision     :
***************************************************************************M*/
bool TinyOci::SetDateFormat( short nFormat )
{    
    char szFormat[256];

    switch( nFormat )
    {
    case TINYOCI_DATEFORMAT_1:
        strcpy( szFormat, "Alter session set NLS_DATE_FORMAT = 'YYYYMMDD' ");
        break;
    case TINYOCI_DATEFORMAT_3:
        strcpy( szFormat, "Alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' ");
        break;
    case TINYOCI_DATEFORMAT_4:
        strcpy( szFormat, "Alter session set NLS_DATE_FORMAT = 'DD-MON-YY' ");
        break;
    case TINYOCI_DATEFORMAT_5:
        strcpy( szFormat, "Alter session set NLS_DATE_FORMAT = 'DD-MON-YYYY' ");
        break;
    case TINYOCI_DATEFORMAT_2:
    default:
        strcpy( szFormat, "Alter session set NLS_DATE_FORMAT = 'YYYYMMDDHH24MISS' ");
        break;
    }

    return Execute( szFormat );
}


// End Of File

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -