доброго времени суток! вот зациклился на вроде бы простом вопросе и не могу двинуться дальше
нужно сделать класс производный от 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 получается какойто кривой запрос на который он и матерится ... подскажите может кто знает как нужно сделать правильно
|