Вопрос по _RecordsetPtr и как его вернуть
От: Frosya Россия http://georgy.spb.ru
Дата: 10.09.03 15:58
Оценка:
Не хочу в каждой функции выкладывать портянку:

if ( pConnect != NULL )
{
    try
    {
        CString sql;
        sql.Format( "SELECT * FROM table" );

        _CommandPtr pCommand;
        pCommand.CreateInstance( __uuidof( Command ) );
        pCommand->ActiveConnection = pConnect;
        pCommand->CommandText = ( _bstr_t ) sql;

        _RecordsetPtr pRecordset;
        pRecordset.CreateInstance( __uuidof( Recordset ) );
        pRecordset->CursorLocation = adUseClient;
        pRecordset->Open( ( IDispatch * ) pCommand, vtMissing, adOpenStatic, adLockBatchOptimistic, adCmdUnknown );

        *res = ( _Recordset * ) pRecordset;
    }
    catch ( _com_error &e )
    {
        // err
    }
}


а хочу засунуть в функцию:

HRESULT Dialog::GetRecordset( CString sql, _Recordset ** res )
{
    if ( pConnect != NULL )
    {
        try
        {
            _CommandPtr pCommand;
            pCommand.CreateInstance( __uuidof( Command ) );
            pCommand->ActiveConnection = pConnect;
            pCommand->CommandText = ( _bstr_t ) sql;

            _RecordsetPtr pRecordset;
            pRecordset.CreateInstance( __uuidof( Recordset ) );
            pRecordset->CursorLocation = adUseClient;
            pRecordset->Open( ( IDispatch * ) pCommand, vtMissing, adOpenStatic, adLockBatchOptimistic, adCmdUnknown );
            *res = ( _Recordset * ) pRecordset;
        }
        catch ( _com_error &e )
        {
            // err
        }
    }

    return S_OK;
}


, но не понимаю, как возвернуть и получить ( для дальнейших действий ) _Recordset?

ПОМОГИТЕ, плиз, я уже устал воевать с этим. Я только начал изучать C++ и стопорица на чем-то не очень хочеца, так как ступор отбивает желание вообще изучать, а ведь интересно

Исправлена подсветка синтаксиса. -- ПК.
$perl = 1 if ( $php );
Re: Вопрос по _RecordsetPtr и как его вернуть
От: Mechanicus Беларусь  
Дата: 10.09.03 19:18
Оценка:
Здравствуйте, Frosya, Вы писали:

F>Не хочу в каждой функции выкладывать портянку:


Эээ, ты это на каком языке написал?
F>
F>if ( pConnect != NULL )
F>{
F>    try
F>    {
F>        CString sql;
F>        sql.Format( "SELECT * FROM table" );

F>        _CommandPtr pCommand;
F>        pCommand.CreateInstance( __uuidof( Command ) );
Может быть pCommand->CreateInstance( __uuidof( Command ) );
F>        pCommand->ActiveConnection = pConnect;
F>        pCommand->CommandText = ( _bstr_t ) sql;

F>        _RecordsetPtr pRecordset;
F>        pRecordset.CreateInstance( __uuidof( Recordset ) );
И тут. pRecordset->CreateInstance( __uuidof( Recordset ) );
F>        pRecordset->CursorLocation = adUseClient;
F>        pRecordset->Open( ( IDispatch * ) pCommand, vtMissing, adOpenStatic, adLockBatchOptimistic, adCmdUnknown );

F>        *res = ( _Recordset * ) pRecordset;
F>    }
F>    catch ( _com_error &e )
F>    {
F>        // err
F>    }
F>}
F>


F>а хочу засунуть в функцию:


F>
F>HRESULT Dialog::GetRecordset( CString sql, _Recordset ** res )
F>{
F>    if ( pConnect != NULL )
F>    {
F>        try
F>        {
F>            _CommandPtr pCommand;
F>            pCommand.CreateInstance( __uuidof( Command ) );
pCommand->CreateInstance( __uuidof( Command ) );
F>            pCommand->ActiveConnection = pConnect;
F>            pCommand->CommandText = ( _bstr_t ) sql;

F>            _RecordsetPtr pRecordset;
F>            pRecordset.CreateInstance( __uuidof( Recordset ) );
pRecordset->CreateInstance( __uuidof( Recordset ) );
F>            pRecordset->CursorLocation = adUseClient;
F>            pRecordset->Open( ( IDispatch * ) pCommand, vtMissing, adOpenStatic, adLockBatchOptimistic, adCmdUnknown );
F>            *res = ( _Recordset * ) pRecordset;
Зачем такое приведение типов, или _RecordsetPtr != _Recordset *?
Вообще чрезмерное использование (type) кастов если они не нужны, и особенно в С++, может привести к ошибкам. Лучше приучаться использовать *_cast'ы, а то так не нароком можно и int к IDispatch привести :)
F>        }
F>        catch ( _com_error &e )
F>        {
F>            // err
F>        }
F>    }

F>    return S_OK;
F>}
F>


F>, но не понимаю, как возвернуть и получить ( для дальнейших действий ) _Recordset?

Странно, что ты хочешь? Вроде почти рабочий код. res — изменяется, в нём и возвращается твой _Recordset. Хотя говорить о возвращениее _Recordset немного не корректно, скорее возвращается указатель на объект класса _Recordset.
F>ПОМОГИТЕ, плиз, я уже устал воевать с этим. Я только начал изучать C++ и стопорица на чем-то не очень хочеца, так как ступор отбивает желание вообще изучать, а ведь интересно
_Recordset (или _RecordsetPtr) recordset;
Ну так и вызывай GetRecordset("bla-bla-bla", &recordset);

PS. ИМХО заменять _Recordset * на _RecordsetPtr не вполне удобно, это всё из Паскаля чтоли пришло. Хотя если у нас какие-то smart-pointera юзаются то это конечно удобнее чем smart_ptr<_Recordset> везде писать.
PPS. На сколько я знаю имена начинающиеся с _ зарезервированы за производителем компилятора, и вполне может случиться конфуз, так-что если все эти _Recordset — твои типы, лучше их переименовать, а ещё можно в отдельный namespace выделить (но тут такого наверное не надо)
... << RSDN@Home 1.1 beta 1 >>
Re[2]: Вопрос по _RecordsetPtr и как его вернуть
От: WolfHound  
Дата: 10.09.03 20:45
Оценка:
Здравствуйте, Mechanicus, Вы писали:

M>Эээ, ты это на каком языке написал?

На С++. Это враперы для ADO сгенерирование директивой #import
... << RSDN@Home 1.1 alpha 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Вопрос по _RecordsetPtr и как его вернуть
От: WolfHound  
Дата: 10.09.03 20:45
Оценка:
Здравствуйте, Frosya, Вы писали:

F>
F>        _RecordsetPtr pRecordset;
F>        pRecordset.CreateInstance( __uuidof( Recordset ) );
F>

Можно заменить на
F>
F>        _RecordsetPtr pRecordset( __uuidof( Recordset ) );
F>


F>
F>HRESULT Dialog::GetRecordset( CString sql, _Recordset ** res )
F>{
F>    if ( pConnect != NULL )
F>    {
F>        try
F>        {
F>            _CommandPtr pCommand;
F>            pCommand.CreateInstance( __uuidof( Command ) );
F>            pCommand->ActiveConnection = pConnect;
F>            pCommand->CommandText = ( _bstr_t ) sql;

F>            _RecordsetPtr pRecordset;
F>            pRecordset.CreateInstance( __uuidof( Recordset ) );
F>            pRecordset->CursorLocation = adUseClient;
F>            pRecordset->Open( ( IDispatch * ) pCommand, vtMissing, adOpenStatic, adLockBatchOptimistic, adCmdUnknown );
F>            *res = pRecordset.Detach();
F>        }
F>        catch ( _com_error &e )
F>        {
F>            // err
F>        }
F>    }

F>    return S_OK;
F>}
F>

Вроде так.
... << RSDN@Home 1.1 alpha 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Вопрос по _RecordsetPtr и как его вернуть
От: Mechanicus Беларусь  
Дата: 10.09.03 21:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Mechanicus, Вы писали:


M>>Эээ, ты это на каком языке написал?

WH>На С++. Это враперы для ADO сгенерирование директивой #import
Тогда я умываю руки
... << RSDN@Home 1.1 beta 1 >>
Re: Вопрос по _RecordsetPtr и как его вернуть
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 11.09.03 08:12
Оценка:
Здравствуйте, Frosya, Вы писали:

F>HRESULT Dialog::GetRecordset( CString sql, _Recordset ** res )


Может, не мучиться с HRESULT, написать _RecordsetPtr Dialog::GetRecordset(CString sql) и обработать исключения выше?
Re: Вопрос по _RecordsetPtr и как его вернуть
От: Frosya Россия http://georgy.spb.ru
Дата: 11.09.03 08:51
Оценка:
Вроде разобрался. путаница была из-за моего глубокого непонимания типов. Как сказала одна моя хорошая знакомая ( программистка ) те, кто когда-то ушел от языков, где типы являются важными очень долго потом учаца снова "общаться" с типами.

Спасибо всем большое. Еще вопросов туева хуча будет — точно:)
$perl = 1 if ( $php );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.