기본 콘텐츠로 건너뛰기

www.pudn.com > ADO_S.rar > common.cpp

■ jwFreeNote_04
www.pudn.com > ADO_S.rar > common.cpp


/*  
     *******************************************************************************  
     *  
     *               긢??긹?긚떎믅긏깋긚  
     *  
     *               �긚긡?뼹     갌  떎믅긖깛긵깑  
     *               긐깑?긵뼹     갌  뻢떈굁괿굆굓  
     *  
     *               ??           갌  됪뽋룉뿚 (굑괷??붎)  
     *               룉뿚둜뾴       갌  긢??긹?긚먝뫏떎믅룉뿚  
     *  
     *               긫?긙깈깛     갌  1.00  
     *               띿맟볷         갌  2004/12/19  
     *               띿맟롌         갌    
     *  
     *******************************************************************************  
    */   
    #include "StdAfx.h"     
    #include "common.h"    
       
    #define ChunkSize 100    
       
       
    ///////////////////////////////////////////////////////    
    //    
    // CADODatabase Class    
    //    
       
    DWORD CADODatabase::GetRecordCount(_RecordsetPtr m_pRs)   
    {   
        DWORD numRows = 0;   
           
        numRows = m_pRs->GetRecordCount();   
       
        if(numRows == -1)   
        {   
            if(m_pRs->EndOfFile != VARIANT_TRUE)   
                m_pRs->MoveFirst();   
       
            while(m_pRs->EndOfFile != VARIANT_TRUE)   
            {   
                numRows++;   
                m_pRs->MoveNext();   
            }   
            if(numRows > 0)   
                m_pRs->MoveFirst();   
        }   
        return numRows;   
    }   
       
    BOOL CADODatabase::Open(LPCTSTR lpstrConnection, LPCTSTR lpstrUserID, LPCTSTR lpstrPassword)   
    {   
        HRESULT hr = S_OK;   
       
        if(IsOpen())   
            Close();   
       
        if(strcmp(lpstrConnection, _T("")) != 0)   
            m_strConnection = lpstrConnection;   
       
        ASSERT(!m_strConnection.IsEmpty());   
       
        try   
        {   
            if(m_nConnectionTimeout != 0)   
                m_pConnection->PutConnectionTimeout(m_nConnectionTimeout);   
            hr = m_pConnection->Open(_bstr_t(m_strConnection), _bstr_t(lpstrUserID), _bstr_t(lpstrPassword), NULL);   
            return hr == S_OK;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
           
    }   
       
    void CADODatabase::dump_com_error(_com_error &e)   
    {   
        CString ErrorStr;   
           
        _bstr_t bstrSource(e.Source());   
        _bstr_t bstrDescription(e.Description());   
        ErrorStr.Format( "CADODataBase Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",   
            e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription);   
        m_strErrorDescription = (LPCSTR)bstrDescription ;   
        m_strLastError = _T("Connection String = " + GetConnectionString() + '\n' + ErrorStr);   
        m_dwLastError = e.Error();    
        #ifdef _DEBUG    
            AfxMessageBox(ErrorStr, MB_OK | MB_ICONERROR );   
        #endif    
    }   
       
    BOOL CADODatabase::IsOpen()   
    {   
        if(m_pConnection )   
            return m_pConnection->GetState() != adStateClosed;   
        return FALSE;   
    }   
       
    void CADODatabase::Close()   
    {   
        if(IsOpen())   
            m_pConnection->Close();   
    }   
       
       
    ///////////////////////////////////////////////////////    
    //    
    // CADORecordset Class    
    //    
       
    CADORecordset::CADORecordset()   
    {   
        m_pRecordset = NULL;   
        m_pCmd = NULL;   
        m_strQuery = _T("");   
        m_strLastError = _T("");   
        m_dwLastError = 0;   
        m_pRecBinding = NULL;   
        m_pRecordset.CreateInstance(__uuidof(Recordset));   
        m_pCmd.CreateInstance(__uuidof(Command));   
        m_nEditStatus = CADORecordset::dbEditNone;   
        m_nSearchDirection = CADORecordset::searchForward;   
    }   
       
    CADORecordset::CADORecordset(CADODatabase* pAdoDatabase)   
    {   
        m_pRecordset = NULL;   
        m_pCmd = NULL;   
        m_strQuery = _T("");   
        m_strLastError = _T("");   
        m_dwLastError = 0;   
        m_pRecBinding = NULL;   
        m_pRecordset.CreateInstance(__uuidof(Recordset));   
        m_pCmd.CreateInstance(__uuidof(Command));   
        m_nEditStatus = CADORecordset::dbEditNone;   
        m_nSearchDirection = CADORecordset::searchForward;   
       
        m_pConnection = pAdoDatabase->GetActiveConnection();   
    }   
       
    BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption)   
    {      
        Close();   
           
        if(strcmp(lpstrExec, _T("")) != 0)   
            m_strQuery = lpstrExec;   
       
        ASSERT(!m_strQuery.IsEmpty());   
       
        if(m_pConnection == NULL)   
            m_pConnection = mpdb;   
       
        m_strQuery.TrimLeft();   
        BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0 && nOption == openUnknown;   
       
        try   
        {   
            m_pRecordset->CursorType = adOpenStatic;   
            m_pRecordset->CursorLocation = adUseClient;   
            if(bIsSelect || nOption == openQuery || nOption == openUnknown)   
                m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),    
                                adOpenStatic, adLockOptimistic, adCmdUnknown);   
            else if(nOption == openTable)   
                m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),    
                                adOpenKeyset, adLockOptimistic, adCmdTable);   
            else if(nOption == openStoredProc)   
            {   
                m_pCmd->ActiveConnection = mpdb;   
                m_pCmd->CommandText = _bstr_t(m_strQuery);   
                m_pCmd->CommandType = adCmdStoredProc;   
                m_pConnection->CursorLocation = adUseClient;   
                   
                m_pRecordset = m_pCmd->Execute(NULL, NULL, adCmdText);   
            }   
            else   
            {   
                TRACE( "Unknown parameter. %d", nOption);   
                return FALSE;   
            }   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
       
        return m_pRecordset != NULL;   
    }   
       
    BOOL CADORecordset::Open(LPCTSTR lpstrExec, int nOption)   
    {   
        ASSERT(m_pConnection != NULL);   
        ASSERT(m_pConnection->GetState() != adStateClosed);   
        return Open(m_pConnection, lpstrExec, nOption);   
    }   
       
    BOOL CADORecordset::OpenSchema(int nSchema, LPCTSTR SchemaID)   
    {   
        try   
        {   
            _variant_t vtSchemaID = vtMissing;   
       
            if(strlen(SchemaID) != 0)   
                vtSchemaID = SchemaID;   
                   
            m_pRecordset = m_pConnection->OpenSchema((enum SchemaEnum)nSchema, vtMissing, vtSchemaID);   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::Requery()   
    {   
        if(IsOpen())   
        {   
            try   
            {   
                //m_pRecordset->Requery(adExecuteRecord); //긍陋狼놔댄    
            }   
            catch(_com_error &e)   
            {   
                dump_com_error(e);   
                return FALSE;   
            }   
        }   
        return TRUE;   
    }   
       
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, double& dbValue)   
    {      
        double val = (double)NULL;   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            switch(vtFld.vt)   
            {   
            case VT_R4:   
                val = vtFld.fltVal;   
                break;   
            case VT_R8:   
                val = vtFld.dblVal;   
                break;   
            case VT_DECIMAL:   
                //Corrected by Jos?Carlos Mart?ez Gal?    
                val = vtFld.decVal.Lo32;   
                val *= (vtFld.decVal.sign == 128)? -1 : 1;   
                val /= pow(10, vtFld.decVal.scale);    
                break;   
            case VT_UI1:   
                val = vtFld.iVal;   
                break;   
            case VT_I2:   
            case VT_I4:   
                val = vtFld.lVal;   
                break;   
            case VT_INT:   
                val = vtFld.intVal;   
                break;   
            case VT_NULL:   
            case VT_EMPTY:   
                val = 0;   
                break;   
            default:   
                val = vtFld.dblVal;   
            }   
            dbValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
       
    BOOL CADORecordset::GetFieldValue(int nIndex, double& dbValue)   
    {      
        double val = (double)NULL;   
        _variant_t vtFld;   
        _variant_t vtIndex;   
       
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            switch(vtFld.vt)   
            {   
            case VT_R4:   
                val = vtFld.fltVal;   
                break;   
            case VT_R8:   
                val = vtFld.dblVal;   
                break;   
            case VT_DECIMAL:   
                //Corrected by Jos?Carlos Mart?ez Gal?    
                val = vtFld.decVal.Lo32;   
                val *= (vtFld.decVal.sign == 128)? -1 : 1;   
                val /= pow(10, vtFld.decVal.scale);    
                break;   
            case VT_UI1:   
                val = vtFld.iVal;   
                break;   
            case VT_I2:   
            case VT_I4:   
                val = vtFld.lVal;   
                break;   
            case VT_INT:   
                val = vtFld.intVal;   
                break;   
            case VT_NULL:   
            case VT_EMPTY:   
                val = 0;   
                break;   
            default:   
                val = 0;   
            }   
            dbValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, long& lValue)   
    {   
        long val = (long)NULL;   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            if(vtFld.vt != VT_NULL && vtFld.vt != VT_EMPTY)   
                val = vtFld.lVal;   
            lValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, long& lValue)   
    {   
        long val = (long)NULL;   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            if(vtFld.vt != VT_NULL && vtFld.vt != VT_EMPTY)   
                val = vtFld.lVal;   
            lValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, unsigned long& ulValue)   
    {   
        long val = (long)NULL;   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            if(vtFld.vt != VT_NULL && vtFld.vt != VT_EMPTY)   
                val = vtFld.ulVal;   
            ulValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, unsigned long& ulValue)   
    {   
        long val = (long)NULL;   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            if(vtFld.vt != VT_NULL && vtFld.vt != VT_EMPTY)   
                val = vtFld.ulVal;   
            ulValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, int& nValue)   
    {   
        int val = NULL;   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            switch(vtFld.vt)   
            {   
            case VT_BOOL:   
                val = vtFld.boolVal;   
                break;   
            case VT_I2:   
            case VT_UI1:   
                val = vtFld.iVal;   
                break;   
            case VT_INT:   
                val = vtFld.intVal;   
                break;   
            case VT_NULL:   
            case VT_EMPTY:   
                val = 0;   
                break;   
            default:   
                val = vtFld.iVal;   
            }      
            nValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, int& nValue)   
    {   
        int val = (int)NULL;   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            switch(vtFld.vt)   
            {   
            case VT_BOOL:   
                val = vtFld.boolVal;   
                break;   
            case VT_I2:   
            case VT_UI1:   
                val = vtFld.iVal;   
                break;   
            case VT_INT:   
                val = vtFld.intVal;   
                break;   
            case VT_NULL:   
            case VT_EMPTY:   
                val = 0;   
                break;   
            default:   
                val = vtFld.iVal;   
            }      
            nValue = val;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, CString& strValue, CString strDateFormat)   
    {   
        CString str = _T("");   
        _variant_t vtFld;   
       
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_R4:   
                str = DblToStr(vtFld.fltVal);   
                break;   
            case VT_R8:   
                str = DblToStr(vtFld.dblVal);   
                break;   
            case VT_BSTR:   
                str = vtFld.bstrVal;   
                break;   
            case VT_I2:   
            case VT_UI1:   
                str = IntToStr(vtFld.iVal);   
                break;   
            case VT_INT:   
                str = IntToStr(vtFld.intVal);   
                break;   
            case VT_I4:   
                str = LongToStr(vtFld.lVal);   
                break;   
            case VT_UI4:   
                str = ULongToStr(vtFld.ulVal);   
                break;   
            case VT_DECIMAL:   
                {   
                //Corrected by Jos?Carlos Mart?ez Gal?    
                double val = vtFld.decVal.Lo32;   
                val *= (vtFld.decVal.sign == 128)? -1 : 1;   
                val /= pow(10, vtFld.decVal.scale);    
                str = DblToStr(val);   
                }   
                break;   
            case VT_DATE:   
                {   
                    COleDateTime dt(vtFld);   
       
                    if(strDateFormat.IsEmpty())   
                        strDateFormat = _T("%Y-%m-%d %H:%M:%S");   
                    str = dt.Format(strDateFormat);   
                }   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                str.Empty();   
                break;   
            case VT_BOOL:   
                str = vtFld.boolVal == VARIANT_TRUE? 'T':'F';   
                break;   
            default:   
                str.Empty();   
                return FALSE;   
            }   
            strValue = str;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, CString& strValue, CString strDateFormat)   
    {   
        CString str = _T("");   
        _variant_t vtFld;   
        _variant_t vtIndex;   
       
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_R4:   
                str = DblToStr(vtFld.fltVal);   
                break;   
            case VT_R8:   
                str = DblToStr(vtFld.dblVal);   
                break;   
            case VT_BSTR:   
                str = vtFld.bstrVal;   
                break;   
            case VT_I2:   
            case VT_UI1:   
                str = IntToStr(vtFld.iVal);   
                break;   
            case VT_INT:   
                str = IntToStr(vtFld.intVal);   
                break;   
            case VT_I4:   
                str = LongToStr(vtFld.lVal);   
                break;   
            case VT_UI4:   
                str = ULongToStr(vtFld.ulVal);   
                break;   
            case VT_DECIMAL:   
                {   
                //Corrected by Jos?Carlos Mart?ez Gal?    
                double val = vtFld.decVal.Lo32;   
                val *= (vtFld.decVal.sign == 128)? -1 : 1;   
                val /= pow(10, vtFld.decVal.scale);    
                str = DblToStr(val);   
                }   
                break;   
            case VT_DATE:   
                {   
                    COleDateTime dt(vtFld);   
                       
                    if(strDateFormat.IsEmpty())   
                        strDateFormat = _T("%Y-%m-%d %H:%M:%S");   
                    str = dt.Format(strDateFormat);   
                }   
                break;   
            case VT_BOOL:   
                str = vtFld.boolVal == VARIANT_TRUE? 'T':'F';   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                str.Empty();   
                break;   
            default:   
                str.Empty();   
                return FALSE;   
            }   
            strValue = str;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, COleDateTime& time)   
    {   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_DATE:   
                {   
                    COleDateTime dt(vtFld);   
                    time = dt;   
                }   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                time.SetStatus(COleDateTime::null);   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, COleDateTime& time)   
    {   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_DATE:   
                {   
                    COleDateTime dt(vtFld);   
                    time = dt;   
                }   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                time.SetStatus(COleDateTime::null);   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, bool& bValue)   
    {   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_BOOL:   
                bValue = vtFld.boolVal == VARIANT_TRUE? true: false;   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                bValue = false;   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, bool& bValue)   
    {   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_BOOL:   
                bValue = vtFld.boolVal == VARIANT_TRUE? true: false;   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                bValue = false;   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, COleCurrency& cyValue)   
    {   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_CY:   
                cyValue = (CURRENCY)vtFld.cyVal;   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                {   
                cyValue = COleCurrency();   
                cyValue.m_status = COleCurrency::null;   
                }   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, COleCurrency& cyValue)   
    {   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            switch(vtFld.vt)    
            {   
            case VT_CY:   
                cyValue = (CURRENCY)vtFld.cyVal;   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                {   
                cyValue = COleCurrency();   
                cyValue.m_status = COleCurrency::null;   
                }   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, _variant_t& vtValue)   
    {   
        try   
        {   
            vtValue = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::GetFieldValue(int nIndex, _variant_t& vtValue)   
    {   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtValue = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::IsFieldNull(LPCTSTR lpFieldName)   
    {   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            return vtFld.vt == VT_NULL;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::IsFieldNull(int nIndex)   
    {   
        _variant_t vtFld;   
        _variant_t vtIndex;   
       
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            return vtFld.vt == VT_NULL;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::IsFieldEmpty(LPCTSTR lpFieldName)   
    {   
        _variant_t vtFld;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;   
            return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::IsFieldEmpty(int nIndex)   
    {   
        _variant_t vtFld;   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        try   
        {   
            vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;   
            return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::SetFieldEmpty(LPCTSTR lpFieldName)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_EMPTY;   
           
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldEmpty(int nIndex)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_EMPTY;   
       
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
       
    DWORD CADORecordset::GetRecordCount()   
    {   
        DWORD nRows = 0;   
           
        nRows = m_pRecordset->GetRecordCount();   
       
        if(nRows == -1)   
        {   
            nRows = 0;   
            if(m_pRecordset->EndOfFile != VARIANT_TRUE)   
                m_pRecordset->MoveFirst();   
               
            while(m_pRecordset->EndOfFile != VARIANT_TRUE)   
            {   
                nRows++;   
                m_pRecordset->MoveNext();   
            }   
            if(nRows > 0)   
                m_pRecordset->MoveFirst();   
        }   
           
        return nRows;   
    }   
       
    BOOL CADORecordset::IsOpen()   
    {   
        if(m_pRecordset != NULL && IsConnectionOpen())   
            return m_pRecordset->GetState() != adStateClosed;   
        return FALSE;   
    }   
       
    void CADORecordset::Close()   
    {   
        if(IsOpen())   
        {   
            if (m_nEditStatus != dbEditNone)   
                  CancelUpdate();   
       
            m_pRecordset->PutSort(_T(""));   
            m_pRecordset->Close();      
        }   
    }   
       
       
    BOOL CADODatabase::Execute(LPCTSTR lpstrExec)   
    {   
        ASSERT(m_pConnection != NULL);   
        ASSERT(strcmp(lpstrExec, _T("")) != 0);   
        _variant_t vRecords;   
           
        m_nRecordsAffected = 0;   
       
        try   
        {   
            m_pConnection->CursorLocation = adUseClient;   
            m_pConnection->Execute(_bstr_t(lpstrExec), &vRecords, adExecuteNoRecords);   
            m_nRecordsAffected = vRecords.iVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;      
        }   
    }   
       
    BOOL CADORecordset::RecordBinding(CADORecordBinding &pAdoRecordBinding)   
    {   
        HRESULT hr;   
        m_pRecBinding = NULL;   
       
        //Open the binding interface.    
        if(FAILED(hr = m_pRecordset->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&m_pRecBinding )))   
        {   
            _com_issue_error(hr);   
            return FALSE;   
        }   
           
        //Bind the recordset to class    
        if(FAILED(hr = m_pRecBinding->BindToRecordset(&pAdoRecordBinding)))   
        {   
            _com_issue_error(hr);   
            return FALSE;   
        }   
        return TRUE;   
    }   
       
    BOOL CADORecordset::GetFieldInfo(LPCTSTR lpFieldName, CADOFieldInfo* fldInfo)   
    {   
        FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);   
           
        return GetFieldInfo(pField, fldInfo);   
    }   
       
    BOOL CADORecordset::GetFieldInfo(int nIndex, CADOFieldInfo* fldInfo)   
    {   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);   
       
        return GetFieldInfo(pField, fldInfo);   
    }   
       
       
    BOOL CADORecordset::GetFieldInfo(FieldPtr pField, CADOFieldInfo* fldInfo)   
    {   
        memset(fldInfo, 0, sizeof(CADOFieldInfo));   
       
        strcpy(fldInfo->m_strName, (LPCTSTR)pField->GetName());   
        fldInfo->m_lDefinedSize = pField->GetDefinedSize();   
        fldInfo->m_nType = pField->GetType();   
        fldInfo->m_lAttributes = pField->GetAttributes();   
        if(!IsEof())   
            fldInfo->m_lSize = pField->GetActualSize();   
        return TRUE;   
    }   
       
    BOOL CADORecordset::GetChunk(LPCTSTR lpFieldName, CString& strValue)   
    {   
        FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);   
           
        return GetChunk(pField, strValue);   
    }   
       
    BOOL CADORecordset::GetChunk(int nIndex, CString& strValue)   
    {   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);   
           
        return GetChunk(pField, strValue);   
    }   
       
       
    BOOL CADORecordset::GetChunk(FieldPtr pField, CString& strValue)   
    {   
        CString str = _T("");   
        long lngSize, lngOffSet = 0;   
        _variant_t varChunk;   
       
        lngSize = pField->ActualSize;   
           
        str.Empty();   
        while(lngOffSet < lngSize)   
        {    
            try   
            {   
                varChunk = pField->GetChunk(ChunkSize);   
                   
                str += varChunk.bstrVal;   
                lngOffSet += ChunkSize;   
            }   
            catch(_com_error &e)   
            {   
                dump_com_error(e);   
                return FALSE;   
            }   
        }   
       
        lngOffSet = 0;   
        strValue = str;   
        return TRUE;   
    }   
       
    BOOL CADORecordset::GetChunk(LPCTSTR lpFieldName, LPVOID lpData)   
    {   
        FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);   
       
        return GetChunk(pField, lpData);   
    }   
       
    BOOL CADORecordset::GetChunk(int nIndex, LPVOID lpData)   
    {   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);   
       
        return GetChunk(pField, lpData);   
    }   
       
    BOOL CADORecordset::GetChunk(FieldPtr pField, LPVOID lpData)   
    {   
        long lngSize, lngOffSet = 0;   
        _variant_t varChunk;       
        UCHAR chData;   
        HRESULT hr;   
        long lBytesCopied = 0;   
       
        lngSize = pField->ActualSize;   
           
        while(lngOffSet < lngSize)   
        {    
            try   
            {   
                varChunk = pField->GetChunk(ChunkSize);   
       
                //Copy the data only upto the Actual Size of Field.      
                for(long lIndex = 0; lIndex <= (ChunkSize - 1); lIndex++)   
                {   
                    hr= SafeArrayGetElement(varChunk.parray, &lIndex, &chData);   
                    if(SUCCEEDED(hr))   
                    {   
                        //Take BYTE by BYTE and advance Memory Location    
                        //hr = SafeArrayPutElement((SAFEARRAY FAR*)lpData, &lBytesCopied ,&chData);     
                        ((UCHAR*)lpData)[lBytesCopied] = chData;   
                        lBytesCopied++;   
                    }   
                    else   
                        break;   
                }   
                lngOffSet += ChunkSize;   
            }   
            catch(_com_error &e)   
            {   
                dump_com_error(e);   
                return FALSE;   
            }   
        }   
       
        lngOffSet = 0;   
        return TRUE;   
    }   
       
    BOOL CADORecordset::AppendChunk(LPCTSTR lpFieldName, LPVOID lpData, UINT nBytes)   
    {   
       
        FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);   
       
        return AppendChunk(pField, lpData, nBytes);   
    }   
       
       
    BOOL CADORecordset::AppendChunk(int nIndex, LPVOID lpData, UINT nBytes)   
    {   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);   
       
        return AppendChunk(pField, lpData, nBytes);   
    }   
       
    BOOL CADORecordset::AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes)   
    {   
        HRESULT hr;   
        _variant_t varChunk;   
        long lngOffset = 0;   
        UCHAR chData;   
        SAFEARRAY FAR *psa = NULL;   
        SAFEARRAYBOUND rgsabound[1];   
       
        try   
        {   
            //Create a safe array to store the array of BYTES     
            rgsabound[0].lLbound = 0;   
            rgsabound[0].cElements = nBytes;   
            psa = SafeArrayCreate(VT_UI1,1,rgsabound);   
       
            while(lngOffset < (long)nBytes)   
            {   
                chData  = ((UCHAR*)lpData)[lngOffset];   
                hr = SafeArrayPutElement(psa, &lngOffset, &chData);   
       
                if(FAILED(hr))   
                    return FALSE;   
                   
                lngOffset++;   
            }   
            lngOffset = 0;   
       
            //Assign the Safe array  to a variant.     
            varChunk.vt = VT_ARRAY|VT_UI1;   
            varChunk.parray = psa;   
       
            hr = pField->AppendChunk(varChunk);   
       
            if(SUCCEEDED(hr)) return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
       
        return FALSE;   
    }   
       
    CString CADORecordset::GetString(LPCTSTR lpCols, LPCTSTR lpRows, LPCTSTR lpNull, long numRows)   
    {   
        _bstr_t varOutput;   
        _bstr_t varNull("");   
        _bstr_t varCols("\t");   
        _bstr_t varRows("\r");   
       
        if(strlen(lpCols) != 0)   
            varCols = _bstr_t(lpCols);   
       
        if(strlen(lpRows) != 0)   
            varRows = _bstr_t(lpRows);   
           
        if(numRows == 0)   
            numRows =(long)GetRecordCount();               
                   
        varOutput = m_pRecordset->GetString(adClipString, numRows, varCols, varRows, varNull);   
       
        return (LPCTSTR)varOutput;   
    }   
       
    CString IntToStr(int nVal)   
    {   
        CString strRet;   
        char buff[10];   
           
        itoa(nVal, buff, 10);   
        strRet = buff;   
        return strRet;   
    }   
       
    CString LongToStr(long lVal)   
    {   
        CString strRet;   
        char buff[20];   
           
        ltoa(lVal, buff, 10);   
        strRet = buff;   
        return strRet;   
    }   
       
    CString ULongToStr(unsigned long ulVal)   
    {   
        CString strRet;   
        char buff[20];   
           
        ultoa(ulVal, buff, 10);   
        strRet = buff;   
        return strRet;   
       
    }   
       
       
    CString DblToStr(double dblVal, int ndigits)   
    {   
        CString strRet;   
        char buff[50];   
       
       _gcvt(dblVal, ndigits, buff);   
        strRet = buff;   
        return strRet;   
    }   
       
    CString DblToStr(float fltVal)   
    {   
        CString strRet = _T("");   
        char buff[50];   
           
       _gcvt(fltVal, 10, buff);   
        strRet = buff;   
        return strRet;   
    }   
       
    void CADORecordset::Edit()   
    {   
        m_nEditStatus = dbEdit;   
    }   
       
    BOOL CADORecordset::AddNew()   
    {   
        m_nEditStatus = dbEditNone;   
        if(m_pRecordset->AddNew() != S_OK)   
            return FALSE;   
       
        m_nEditStatus = dbEditNew;   
        return TRUE;   
    }   
       
    BOOL CADORecordset::AddNew(CADORecordBinding &pAdoRecordBinding)   
    {   
        try   
        {   
            if(m_pRecBinding->AddNew(&pAdoRecordBinding) != S_OK)   
            {   
                return FALSE;   
            }   
            else   
            {   
                m_pRecBinding->Update(&pAdoRecordBinding);   
                return TRUE;   
            }   
                   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }      
    }   
       
    BOOL CADORecordset::Update()   
    {   
        BOOL bret = TRUE;   
       
        if(m_nEditStatus != dbEditNone)   
        {   
       
            try   
            {   
                if(m_pRecordset->Update() != S_OK)   
                    bret = FALSE;   
            }   
            catch(_com_error &e)   
            {   
                dump_com_error(e);   
                bret = FALSE;   
            }   
       
            if(!bret)   
                m_pRecordset->CancelUpdate();   
            m_nEditStatus = dbEditNone;   
        }   
        return bret;   
    }   
       
    void CADORecordset::CancelUpdate()   
    {   
        m_pRecordset->CancelUpdate();   
        m_nEditStatus = dbEditNone;   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, CString strValue)   
    {   
        _variant_t vtFld;   
        _variant_t vtIndex;    
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        if(!strValue.IsEmpty())   
            vtFld.vt = VT_BSTR;   
        else   
            vtFld.vt = VT_NULL;   
       
        //Corrected by Giles Forster 10/03/2001    
        vtFld.bstrVal = strValue.AllocSysString();   
       
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, CString strValue)   
    {   
        _variant_t vtFld;   
       
        if(!strValue.IsEmpty())   
            vtFld.vt = VT_BSTR;   
        else   
            vtFld.vt = VT_NULL;   
       
        //Corrected by Giles Forster 10/03/2001    
        vtFld.bstrVal = strValue.AllocSysString();   
       
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, int nValue)   
    {   
        _variant_t vtFld;   
           
        vtFld.vt = VT_I2;   
        vtFld.iVal = nValue;   
           
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, int nValue)   
    {   
        _variant_t vtFld;   
           
        vtFld.vt = VT_I2;   
        vtFld.iVal = nValue;   
           
           
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, long lValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_I4;   
        vtFld.lVal = lValue;   
           
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
           
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, long lValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_I4;   
        vtFld.lVal = lValue;   
           
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, unsigned long ulValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_UI4;   
        vtFld.ulVal = ulValue;   
           
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
           
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, unsigned long ulValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_UI4;   
        vtFld.ulVal = ulValue;   
           
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, double dblValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_R8;   
        vtFld.dblVal = dblValue;   
       
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
       
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, double dblValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_R8;   
        vtFld.dblVal = dblValue;   
               
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, COleDateTime time)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_DATE;   
        vtFld.date = time;   
           
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, COleDateTime time)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_DATE;   
        vtFld.date = time;   
           
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
       
       
    BOOL CADORecordset::SetFieldValue(int nIndex, bool bValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_BOOL;   
        vtFld.boolVal = bValue;   
           
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, bool bValue)   
    {   
        _variant_t vtFld;   
        vtFld.vt = VT_BOOL;   
        vtFld.boolVal = bValue;   
           
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
       
    BOOL CADORecordset::SetFieldValue(int nIndex, COleCurrency cyValue)   
    {   
        if(cyValue.m_status == COleCurrency::invalid)   
            return FALSE;   
       
        _variant_t vtFld;   
               
        vtFld.vt = VT_CY;   
        vtFld.cyVal = cyValue.m_cur;   
           
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, COleCurrency cyValue)   
    {   
        if(cyValue.m_status == COleCurrency::invalid)   
            return FALSE;   
       
        _variant_t vtFld;   
       
        vtFld.vt = VT_CY;   
        vtFld.cyVal = cyValue.m_cur;       
               
        return PutFieldValue(lpFieldName, vtFld);   
    }   
       
    BOOL CADORecordset::SetFieldValue(int nIndex, _variant_t vtValue)   
    {   
        _variant_t vtIndex;   
           
        vtIndex.vt = VT_I2;   
        vtIndex.iVal = nIndex;   
           
        return PutFieldValue(vtIndex, vtValue);   
    }   
       
    BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, _variant_t vtValue)   
    {      
        return PutFieldValue(lpFieldName, vtValue);   
    }   
       
       
    BOOL CADORecordset::SetBookmark()   
    {   
        if(m_varBookmark.vt != VT_EMPTY)   
        {   
            m_pRecordset->Bookmark = m_varBookmark;   
            return TRUE;   
        }   
        return FALSE;   
    }   
       
    BOOL CADORecordset::Delete()   
    {   
        if(m_pRecordset->Delete(adAffectCurrent) != S_OK)   
            return FALSE;   
       
        if(m_pRecordset->Update() != S_OK)   
            return FALSE;   
           
        m_nEditStatus = dbEditNone;   
        return TRUE;   
    }   
       
    BOOL CADORecordset::Find(LPCTSTR lpFind, int nSearchDirection)   
    {   
       
        m_strFind = lpFind;   
        m_nSearchDirection = nSearchDirection;   
       
        ASSERT(!m_strFind.IsEmpty());   
       
        if(m_nSearchDirection == searchForward)   
        {   
            m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchForward, "");   
            if(!IsEof())   
            {   
                m_varBookFind = m_pRecordset->Bookmark;   
                return TRUE;   
            }   
        }   
        else if(m_nSearchDirection == searchBackward)   
        {   
            m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchBackward, "");   
            if(!IsBof())   
            {   
                m_varBookFind = m_pRecordset->Bookmark;   
                return TRUE;   
            }   
        }   
        else   
        {   
            TRACE("Unknown parameter. %d", nSearchDirection);   
            m_nSearchDirection = searchForward;   
        }   
        return FALSE;   
    }   
       
    BOOL CADORecordset::FindFirst(LPCTSTR lpFind)   
    {   
        m_pRecordset->MoveFirst();   
        return Find(lpFind);   
    }   
       
    BOOL CADORecordset::FindNext()   
    {   
        if(m_nSearchDirection == searchForward)   
        {   
            m_pRecordset->Find(_bstr_t(m_strFind), 1, adSearchForward, m_varBookFind);   
            if(!IsEof())   
            {   
                m_varBookFind = m_pRecordset->Bookmark;   
                return TRUE;   
            }   
        }   
        else   
        {   
            m_pRecordset->Find(_bstr_t(m_strFind), 1, adSearchBackward, m_varBookFind);   
            if(!IsBof())   
            {   
                m_varBookFind = m_pRecordset->Bookmark;   
                return TRUE;   
            }   
        }   
        return FALSE;   
    }   
       
    BOOL CADORecordset::PutFieldValue(LPCTSTR lpFieldName, _variant_t vtFld)   
    {   
        if(m_nEditStatus == dbEditNone)   
            return FALSE;   
           
        try   
        {   
            m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld;    
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;      
        }   
    }   
       
       
    BOOL CADORecordset::PutFieldValue(_variant_t vtIndex, _variant_t vtFld)   
    {   
        if(m_nEditStatus == dbEditNone)   
            return FALSE;   
       
        try   
        {   
            m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::Clone(CADORecordset &pRs)   
    {   
        try   
        {   
            pRs.m_pRecordset = m_pRecordset->Clone(adLockUnspecified);   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::SetFilter(LPCTSTR strFilter)   
    {   
        ASSERT(IsOpen());   
           
        try   
        {   
            m_pRecordset->PutFilter(strFilter);   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::SetSort(LPCTSTR strCriteria)   
    {   
        ASSERT(IsOpen());   
           
        try   
        {   
            m_pRecordset->PutSort(strCriteria);   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::SaveAsXML(LPCTSTR lpstrXMLFile)   
    {   
        HRESULT hr;   
       
        ASSERT(IsOpen());   
           
        try   
        {   
            hr = m_pRecordset->Save(lpstrXMLFile, adPersistXML);   
            return hr == S_OK;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
        return TRUE;   
    }   
       
    BOOL CADORecordset::OpenXML(LPCTSTR lpstrXMLFile)   
    {   
        HRESULT hr = S_OK;   
       
        if(IsOpen())   
            Close();   
       
        try   
        {   
            hr = m_pRecordset->Open(lpstrXMLFile, "Provider=MSPersist;", adOpenForwardOnly, adLockOptimistic, adCmdFile);   
            return hr == S_OK;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADORecordset::Execute(CADOCommand* pAdoCommand)   
    {   
        if(IsOpen())   
            Close();   
       
        ASSERT(!pAdoCommand->GetText().IsEmpty());   
        try   
        {   
            m_pConnection->CursorLocation = adUseClient;   
            m_pRecordset = pAdoCommand->GetCommand()->Execute(NULL, NULL, pAdoCommand->GetType());   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    void CADORecordset::dump_com_error(_com_error &e)   
    {   
        CString ErrorStr;   
           
           
        _bstr_t bstrSource(e.Source());   
        _bstr_t bstrDescription(e.Description());   
        ErrorStr.Format( "CADORecordset Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",   
            e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );   
        m_strLastError = _T("Query = " + GetQuery() + '\n' + ErrorStr);   
        m_dwLastError = e.Error();   
        #ifdef _DEBUG    
            AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );   
        #endif      
    }   
       
       
    ///////////////////////////////////////////////////////    
    //    
    // CADOCommad Class    
    //    
       
    CADOCommand::CADOCommand(CADODatabase* pAdoDatabase, CString strCommandText, int nCommandType)   
    {   
        m_pCommand = NULL;   
        m_pCommand.CreateInstance(__uuidof(Command));   
        m_strCommandText = strCommandText;   
        m_pCommand->CommandText = m_strCommandText.AllocSysString();   
        m_nCommandType = nCommandType;   
        m_pCommand->CommandType = (CommandTypeEnum)m_nCommandType;   
        m_pCommand->ActiveConnection = pAdoDatabase->GetActiveConnection();      
        m_nRecordsAffected = 0;   
    }   
       
    BOOL CADOCommand::AddParameter(CADOParameter* pAdoParameter)   
    {   
        ASSERT(pAdoParameter->GetParameter() != NULL);   
       
        try   
        {   
            m_pCommand->Parameters->Append(pAdoParameter->GetParameter());   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOCommand::AddParameter(CString strName, int nType, int nDirection, long lSize, int nValue)   
    {   
       
        _variant_t vtValue;   
       
        vtValue.vt = VT_I2;   
        vtValue.iVal = nValue;   
       
        return AddParameter(strName, nType, nDirection, lSize, vtValue);   
    }   
       
    BOOL CADOCommand::AddParameter(CString strName, int nType, int nDirection, long lSize, long lValue)   
    {   
       
        _variant_t vtValue;   
       
        vtValue.vt = VT_I4;   
        vtValue.lVal = lValue;   
       
        return AddParameter(strName, nType, nDirection, lSize, vtValue);   
    }   
       
    BOOL CADOCommand::AddParameter(CString strName, int nType, int nDirection, long lSize, double dblValue, int nPrecision, int nScale)   
    {   
       
        _variant_t vtValue;   
       
        vtValue.vt = VT_R8;   
        vtValue.dblVal = dblValue;   
       
        return AddParameter(strName, nType, nDirection, lSize, vtValue, nPrecision, nScale);   
    }   
       
    BOOL CADOCommand::AddParameter(CString strName, int nType, int nDirection, long lSize, CString strValue)   
    {   
       
        _variant_t vtValue;   
       
        vtValue.vt = VT_BSTR;   
        vtValue.bstrVal = strValue.AllocSysString();   
       
        return AddParameter(strName, nType, nDirection, lSize, vtValue);   
    }   
       
    BOOL CADOCommand::AddParameter(CString strName, int nType, int nDirection, long lSize, COleDateTime time)   
    {   
       
        _variant_t vtValue;   
       
        vtValue.vt = VT_DATE;   
        vtValue.date = time;   
       
        return AddParameter(strName, nType, nDirection, lSize, vtValue);   
    }   
       
       
    BOOL CADOCommand::AddParameter(CString strName, int nType, int nDirection, long lSize, _variant_t vtValue, int nPrecision, int nScale)   
    {   
        try   
        {   
            _ParameterPtr pParam = m_pCommand->CreateParameter(strName.AllocSysString(), (DataTypeEnum)nType, (ParameterDirectionEnum)nDirection, lSize, vtValue);   
            pParam->PutPrecision(nPrecision);   
            pParam->PutNumericScale(nScale);   
            m_pCommand->Parameters->Append(pParam);   
               
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
       
    void CADOCommand::SetText(CString strCommandText)   
    {   
        ASSERT(!strCommandText.IsEmpty());   
       
        m_strCommandText = strCommandText;   
        m_pCommand->CommandText = m_strCommandText.AllocSysString();   
    }   
       
    void CADOCommand::SetType(int nCommandType)   
    {   
        m_nCommandType = nCommandType;   
        m_pCommand->CommandType = (CommandTypeEnum)m_nCommandType;   
    }   
       
    BOOL CADOCommand::Execute()   
    {   
        _variant_t vRecords;   
        m_nRecordsAffected = 0;   
        try   
        {   
            m_pCommand->Execute(&vRecords, NULL, adCmdStoredProc);   
            m_nRecordsAffected = vRecords.iVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    void CADOCommand::dump_com_error(_com_error &e)   
    {   
        CString ErrorStr;   
           
           
        _bstr_t bstrSource(e.Source());   
        _bstr_t bstrDescription(e.Description());   
        ErrorStr.Format( "CADOCommand Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",   
            e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );   
        m_strLastError = ErrorStr;   
        m_dwLastError = e.Error();   
        #ifdef _DEBUG    
            AfxMessageBox(ErrorStr, MB_OK | MB_ICONERROR);   
        #endif      
    }   
       
       
    ///////////////////////////////////////////////////////    
    //    
    // CADOParameter Class    
    //    
       
    CADOParameter::CADOParameter(int nType, long lSize, int nDirection, CString strName)   
    {   
        m_pParameter = NULL;   
        m_pParameter.CreateInstance(__uuidof(Parameter));   
        m_strName = _T("");   
        m_pParameter->Direction = (ParameterDirectionEnum)nDirection;   
        m_strName = strName;   
        m_pParameter->Name = m_strName.AllocSysString();   
        m_pParameter->Type = (DataTypeEnum)nType;   
        m_pParameter->Size = lSize;   
        m_nType = nType;   
    }   
       
    BOOL CADOParameter::SetValue(int nValue)   
    {   
        _variant_t vtVal;   
       
        ASSERT(m_pParameter != NULL);   
           
        vtVal.vt = VT_I2;   
        vtVal.iVal = nValue;   
       
        try   
        {   
            if(m_pParameter->Size == 0)   
                m_pParameter->Size = sizeof(int);   
       
            m_pParameter->Value = vtVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
       
    BOOL CADOParameter::SetValue(long lValue)   
    {   
        _variant_t vtVal;   
       
        ASSERT(m_pParameter != NULL);   
           
        vtVal.vt = VT_I4;   
        vtVal.lVal = lValue;   
       
        try   
        {   
            if(m_pParameter->Size == 0)   
                m_pParameter->Size = sizeof(long);   
       
            m_pParameter->Value = vtVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::SetValue(double dblValue)   
    {   
        _variant_t vtVal;   
       
        ASSERT(m_pParameter != NULL);   
           
        vtVal.vt = VT_R8;   
        vtVal.dblVal = dblValue;   
       
        try   
        {   
            if(m_pParameter->Size == 0)   
                m_pParameter->Size = sizeof(double);   
       
            m_pParameter->Value = vtVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::SetValue(CString strValue)   
    {   
        _variant_t vtVal;   
       
        ASSERT(m_pParameter != NULL);   
           
        if(!strValue.IsEmpty())   
            vtVal.vt = VT_BSTR;   
        else   
            vtVal.vt = VT_NULL;   
       
        //Corrected by Giles Forster 10/03/2001    
        vtVal.bstrVal = strValue.AllocSysString();   
       
        try   
        {   
            if(m_pParameter->Size == 0)   
                m_pParameter->Size = sizeof(char) * strValue.GetLength();   
       
            m_pParameter->Value = vtVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::SetValue(COleDateTime time)   
    {   
        _variant_t vtVal;   
       
        ASSERT(m_pParameter != NULL);   
           
        vtVal.vt = VT_DATE;   
        vtVal.date = time;   
       
        try   
        {   
            if(m_pParameter->Size == 0)   
                m_pParameter->Size = sizeof(DATE);   
       
            m_pParameter->Value = vtVal;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::SetValue(_variant_t vtValue)   
    {   
       
        ASSERT(m_pParameter != NULL);   
       
        try   
        {   
            if(m_pParameter->Size == 0)   
                m_pParameter->Size = sizeof(VARIANT);   
               
            m_pParameter->Value = vtValue;   
            return TRUE;   
        }   
        catch(_com_error &e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::GetValue(int& nValue)   
    {   
        _variant_t vtVal;   
        int nVal = 0;   
       
        try   
        {   
            vtVal = m_pParameter->Value;   
       
            switch(vtVal.vt)   
            {   
            case VT_BOOL:   
                nVal = vtVal.boolVal;   
                break;   
            case VT_I2:   
            case VT_UI1:   
                nVal = vtVal.iVal;   
                break;   
            case VT_INT:   
                nVal = vtVal.intVal;   
                break;   
            case VT_NULL:   
            case VT_EMPTY:   
                nVal = 0;   
                break;   
            default:   
                nVal = vtVal.iVal;   
            }      
            nValue = nVal;   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::GetValue(long& lValue)   
    {   
        _variant_t vtVal;   
        long lVal = 0;   
       
        try   
        {   
            vtVal = m_pParameter->Value;   
            if(vtVal.vt != VT_NULL && vtVal.vt != VT_EMPTY)   
                lVal = vtVal.lVal;   
            lValue = lVal;   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::GetValue(double& dbValue)   
    {   
        _variant_t vtVal;   
        double dblVal;   
        try   
        {   
            vtVal = m_pParameter->Value;   
            switch(vtVal.vt)   
            {   
            case VT_R4:   
                dblVal = vtVal.fltVal;   
                break;   
            case VT_R8:   
                dblVal = vtVal.dblVal;   
                break;   
            case VT_DECIMAL:   
                //Corrected by Jos?Carlos Mart?ez Gal?    
                dblVal = vtVal.decVal.Lo32;   
                dblVal *= (vtVal.decVal.sign == 128)? -1 : 1;   
                dblVal /= pow(10, vtVal.decVal.scale);    
                break;   
            case VT_UI1:   
                dblVal = vtVal.iVal;   
                break;   
            case VT_I2:   
            case VT_I4:   
                dblVal = vtVal.lVal;   
                break;   
            case VT_INT:   
                dblVal = vtVal.intVal;   
                break;   
            case VT_NULL:   
            case VT_EMPTY:   
                dblVal = 0;   
                break;   
            default:   
                dblVal = 0;   
            }   
            dbValue = dblVal;   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::GetValue(CString& strValue, CString strDateFormat)   
    {   
        _variant_t vtVal;   
        CString strVal = _T("");   
       
        try   
        {   
            vtVal = m_pParameter->Value;   
            switch(vtVal.vt)    
            {   
            case VT_R4:   
                strVal = DblToStr(vtVal.fltVal);   
                break;   
            case VT_R8:   
                strVal = DblToStr(vtVal.dblVal);   
                break;   
            case VT_BSTR:   
                strVal = vtVal.bstrVal;   
                break;   
            case VT_I2:   
            case VT_UI1:   
                strVal = IntToStr(vtVal.iVal);   
                break;   
            case VT_INT:   
                strVal = IntToStr(vtVal.intVal);   
                break;   
            case VT_I4:   
                strVal = LongToStr(vtVal.lVal);   
                break;   
            case VT_DECIMAL:   
                {   
                //Corrected by Jos?Carlos Mart?ez Gal?    
                double val = vtVal.decVal.Lo32;   
                val *= (vtVal.decVal.sign == 128)? -1 : 1;   
                val /= pow(10, vtVal.decVal.scale);    
                strVal = DblToStr(val);   
                }   
                break;   
            case VT_DATE:   
                {   
                    COleDateTime dt(vtVal);   
       
                    if(strDateFormat.IsEmpty())   
                        strDateFormat = _T("%Y-%m-%d %H:%M:%S");   
                    strVal = dt.Format(strDateFormat);   
                }   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                strVal.Empty();   
                break;   
            default:   
                strVal.Empty();   
                return FALSE;   
            }   
            strValue = strVal;   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::GetValue(COleDateTime& time)   
    {   
        _variant_t vtVal;   
       
        try   
        {   
            vtVal = m_pParameter->Value;   
            switch(vtVal.vt)    
            {   
            case VT_DATE:   
                {   
                    COleDateTime dt(vtVal);   
                    time = dt;   
                }   
                break;   
            case VT_EMPTY:   
            case VT_NULL:   
                time.SetStatus(COleDateTime::null);   
                break;   
            default:   
                return FALSE;   
            }   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
    BOOL CADOParameter::GetValue(_variant_t& vtValue)   
    {   
        try   
        {   
            vtValue = m_pParameter->Value;   
            return TRUE;   
        }   
        catch(_com_error& e)   
        {   
            dump_com_error(e);   
            return FALSE;   
        }   
    }   
       
       
    void CADOParameter::dump_com_error(_com_error &e)   
    {   
        CString ErrorStr;   
           
           
        _bstr_t bstrSource(e.Source());   
        _bstr_t bstrDescription(e.Description());   
        ErrorStr.Format( "CADOParameter Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",   
            e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );   
        m_strLastError = ErrorStr;   
        m_dwLastError = e.Error();   
        #ifdef _DEBUG    
            AfxMessageBox(ErrorStr, MB_OK | MB_ICONERROR);   
        #endif      
    }   
       
    IMPLEMENT_DYNAMIC(CADOException, CException)   
       
    CADOException::CADOException(int nCause, CString strErrorString) : CException(TRUE)   
    {   
        m_nCause = nCause;   
        m_strErrorString = strErrorString;   
    }   
       
    CADOException::~CADOException()   
    {   
       
    }   
       
    int CADOException::GetError(int nADOError)   
    {   
        switch (nADOError)   
        {   
        case noError:   
            return CADOException::noError;   
            break;   
        default:   
            return CADOException::Unknown;   
        }   
           
    }   
       
    void AfxThrowADOException(int nADOError, CString strErrorString)   
    {   
        throw new CADOException(nADOError, strErrorString);   
    }   
       
    void CADORecordset::SetDatabase(CADODatabase *pDB)   
    {   
        m_pConnection = pDB->GetActiveConnection();   
    }




window.google_render_ad(); 

댓글

댓글 쓰기

이 블로그의 인기 게시물

80040154 오류로 인해 CLSID가 {xxxx-...}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.

원문보기 .NET 으로 만든 응용프로그램에서 com 객체를 호출한 경우 Windows7 64bit 에서 제목과 같은 에러가 발생했다. Win32 COM 과 .NET 프로그램간의 호환성 때문에 생긴 문제였다. 원인은 .NET 실행시 JIT 컴파일러에 의해 최적화된 기계어로 변환되기 때문.. Win32 COM은 컴파일시.. Win32 COM에 맞춰 빌드 속성에서 하위버전으로 맞춰 컴파일을 다시하는 방법도 있지만 메인 프로젝트가 .NET이라면 참조되는 모든 프로젝트를 다 바꿔야할 노릇.. 또 다른 방법은 COM+를 이용하여 독립적으로 만드는 것이다. 분리시키는 방법은 아래 주소해서 확인할 수 있다. http://support.microsoft.com/kb/281335 나의 경우는 Win32 COM DLL을 64비트 .NET 프로그램에서 참조하니 COM 객체를 제대로 호출하지 못하였습니다. 그래서 .NET 프로그램의 Target Machine을 x86으로 설정하니 제대로 COM 객체를 호출하였습니다.

[Pyinstaller] 실행 파일 관리자 권한 획득하기

고객사에서 일부 사용자에게서 프로그램 오류가 발생한다며 아래와 같이 에러 캡처를 보내왔습니다. 프로그램에서 로그를 남기기 위해 로그 파일을 생성하는데 권한의 문제로 로그 파일을 생성하지 못해 프로그램 오류가 발생한 것 같습니다. 처음에는 Python 코드에서 관리자 권한을 요청하는 코드를 넣으려고 했는데, 실제로 Stackoverflow를 찾아보면 이런 내용이 나옵니다. 프로그램이 관리자 권한으로 실행되지 않았다면 관리자 권한으로 다시 프로그램을 실행시키는 코드입니다. import os import sys import win32com.shell.shell as shell ASADMIN = 'asadmin' if sys.argv[-1] != ASADMIN: script = os.path.abspath(sys.argv[0]) params = ' '.join([script] + sys.argv[1:] + [ASADMIN]) shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) sys.exit(0) 하지만 개인적으로 이런 방식은 마음에 들지 않았고 조금 더 찾아보니 Pyinstaller로 exe 파일을 만들 때 옵션을 설정하여 관리자 권한을 요청하도록 할 수 있다고 합니다. --uac-admin을 옵션에 추가하면 프로그램 실행 시 관리자 권한을 요청할 수 있습니다. pyinstaller.exe --uac-admin sample.py 하지만 안타깝게도 이 방식은 원하는 대로 동작하지 않았습니다. 마지막으로 manifest 파일을 이용하여 시도해보았습니다. spec 파일을 이용하여 pyinstaller로 빌드하면 <실행 파일 이름>.manifest 라는 파일이 생성됩니다. 파일에서 아랫부분을 찾아볼 수 있습니다. <security> <re

초간단 프로그램 락 걸기

프로그램에 락을 걸 일이 생겨났다. 하드웨어 락을 걸면 쉬울텐데 그 정도는 아니고 프로그램의 실행 날짜를 제한 해 달라고 한다. 그래서 파일(license.lic)을 가지고 락을 걸리고 결정을 했다. 요구 사항은 아래와 같다. 1. license.lic 파일이 없으면 프로그램을 실행 할수 없게 한다. 2. 지정한 날짜를 넘어서는 프로그램을 실행 할수 없게 한다. 3. 사용자가 시스템 날짜를 되돌렸을때 인식하여 프로그램을 실행 할수 없게 한다. 음.... 1.번 문제는 사용자가 프로그램을 실행하기 위해서 license.lic 파일을 받아야만 한다. license.lic 파일에는 최근 실행 날짜/종료날짜 이런식으로 적도록 한다.(물론 내용은 암호화 한다.) 최근 실행날짜는 프로그램이 실행때마다 업데이트 하도록 하고 시스템 날짜와 비교하여 시스템 날짜가 최근 실행 날짜보다 이전의 날짜면 시스템 날짜를 되돌렸다고 인식하도록 한다.(3.번 문제 해결) 시스템 날짜와 종료 날짜를 비교하여 시스템 날짜가 종료 날짜를 넘으면 프로그램을 실행 할수 없도록 한다.(2.번 문제 해결)