Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > crecordset немного более усложненные запросы


Автор: hash_2000 17.12.2008, 08:50
доброго времени суток!
вот зациклился на вроде бы простом вопросе и не могу двинуться дальше

нужно сделать класс производный от CRecordset который возвращает результат количество записей например
пишу так:
Код


class COneValueRecord : public CRecordset
{
public:
    COneValueRecord( CDatabase * _db, LPCSTR _FieldName, UINT _TypeId = DBVT_LONG ) 
        : CRecordset(_db)
        , m_FieldName(_FieldName)
        , m_TypeID(_TypeId)    {
        m_nFields = 1;
    }

    virtual ~COneValueRecord() {
    }

    virtual void DoFieldExchange(CFieldExchange* pFX)
        {
    pFX->SetFieldType( CFieldExchange::outputColumn );

    switch( m_TypeID )
    {
        case    DBVT_NULL:
                    break;
        case    DBVT_BOOL:
                    RFX_Bool( pFX, m_FieldName, m_Result.m_boolVal );
                    break;
        case    DBVT_UCHAR:
                    RFX_Byte( pFX, m_FieldName, m_Result.m_chVal );
                    break;
        case    DBVT_SHORT:
                    RFX_Long( pFX, m_FieldName, m_Result.m_lVal );
                    break;
        case    DBVT_LONG:
                    RFX_Long( pFX, m_FieldName, m_Result.m_lVal );
                    break;
        case    DBVT_SINGLE:
                    RFX_Single( pFX, m_FieldName, m_Result.m_fltVal );
                    break;
        case    DBVT_DOUBLE:
                    RFX_Double( pFX, m_FieldName, m_Result.m_dblVal );
                    break;
        case    DBVT_DATE:
                    RFX_Date( pFX, m_FieldName, *m_Result.m_pdate );
                    break;
        case    DBVT_STRING:
                {
                    CODBCFieldInfo    fi;
                    GetODBCFieldInfo( m_FieldName, fi );
                    RFX_Text( pFX, m_FieldName, *m_Result.m_pstring, fi.m_nPrecision );
                    break;
                }
        case    DBVT_BINARY:
                    RFX_LongBinary( pFX, m_FieldName, *(m_Result.m_pbinary) );
                    break;
        default:
            ASSERT( FALSE );
    }

}

public:
    CDBVariant    m_Result;
    LPCSTR m_FieldName;
    UINT m_TypeID;
};


далее гдето в коде:
Код

    const char _sql_mask [] = 
        " select count(*) as result "
        " from _otpusk_graph "
        " where worker_id = %i";

    CString _sql;
    _sql.Format( _sql_mask, m_WorkerID );
       // получается запрос вроде :
       // select count(*) as result from _otpusk_graph where worker_id = 1
 
        COneValueRecord rc( &__get_TheApp()->m_db, "result" );
    rc.Open( _sql.GetString() );


какбы ничего сложного ... но после того как CRecordset прогонит запрос через BuildSQL в функции Open
получается какойто кривой запрос на который он и матерится ...
подскажите может кто знает как нужно сделать правильно 





Автор: hash_2000 17.12.2008, 13:24
все разобрался ...

те кому интересно 
http://msdn.microsoft.com/ru-ru/library/eh6hyfxs.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)