Re[15]: Может есть еще идеи
От: Osi2 Украина  
Дата: 22.04.03 14:16
Оценка:
Здравствуйте, Ivan, Вы писали:

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


I>Надо разобраться, почему открытие соединения вовзаращает E_FAIL, сейчас маршалинг явно ни при чем


Прошу меня извинить, потому что прогнал немного.

забыл указать провайдера:

m_Connection->Provider = "ExOLEDB.DataSource";

то есть, при создании Connection'a вручную все ОК.
Re[16]: Может есть еще идеи
От: Osi2 Украина  
Дата: 22.04.03 14:33
Оценка:
Здравствуйте, Osi2, Вы писали:

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


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


O>то есть, при создании Connection'a вручную все ОК.



А надо ли обязательно передавать указатель на GIT внутрь потока?

До этого у меня он был глобальной переменной. Может дело в этом?

сейчас попробую.
Re[17]: Может есть еще идеи
От: Ivan Россия www.rsdn.ru
Дата: 22.04.03 14:54
Оценка: 2 (1)
Здравствуйте, Osi2, Вы писали:

O>то есть, при создании Connection'a вручную все ОК.


Мне начинает казаться, что проблема заключается вовсе не в GIT и марашлинге, а в самом ADO.
Кстати, не походит вариант с созданием соединения в каждом рабочем потоке непосредственно перед открытием rrecordset'а ?
Re[17]: Может есть еще идеи
От: Osi2 Украина  
Дата: 22.04.03 14:58
Оценка:
Здравствуйте, Osi2, Вы писали:


O>А надо ли обязательно передавать указатель на GIT внутрь потока?


O>До этого у меня он был глобальной переменной. Может дело в этом?


O>сейчас попробую.


не помогло. странно, но такая же ошибка

## ERROR: CCreateAppointment::SelectAppointments, Error when opening recordset: The application called an interface that was marshalled for a different thread., hr: 0
Re[18]: Может есть еще идеи
От: Osi2 Украина  
Дата: 22.04.03 15:07
Оценка:
Здравствуйте, Ivan, Вы писали:

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


O>то есть, при создании Connection'a вручную все ОК.


I>Мне начинает казаться, что проблема заключается вовсе не в GIT и марашлинге, а в самом ADO.

I>Кстати, не походит вариант с созданием соединения в каждом рабочем потоке непосредственно перед открытием rrecordset'а ?

именно это пока и работает. когда по ConnectionString создаю новое соединение. тогда все S_OK!

а что может быть тогда с ADO? Не может быть, что я в одном потоке создаю соединения и не закрываю их?

Может контролировать открытия с пом AddRef() и Release()? Может он наоборот закрывается? Я вообще с ними не работал , не знаю точно — они для этого используются или нет?
Re[19]: Может есть еще идеи
От: Ivan Россия www.rsdn.ru
Дата: 23.04.03 07:56
Оценка:
Здравствуйте, Osi2, Вы писали:

O>а что может быть тогда с ADO? Не может быть, что я в одном потоке создаю соединения и не закрываю их?

Покажи, откуда у тебя берется pRecordset ? Он создается в апартменте рабочего потока ?
Re[20]: Может есть еще идеи
От: Osi2 Украина  
Дата: 23.04.03 08:09
Оценка:
Здравствуйте, Ivan, Вы писали:

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


O>а что может быть тогда с ADO? Не может быть, что я в одном потоке создаю соединения и не закрываю их?

I>Покажи, откуда у тебя берется pRecordset ? Он создается в апартменте рабочего потока ?

вот код:



        CoInitialize(NULL);
    HRESULT hr = S_OK;

    IAppointmentPtr pAppointment(__uuidof(Appointment));
    _ConnectionPtr m_Connection(__uuidof(Connection));
    _RecordsetPtr pRecordset(__uuidof(Recordset));

    try
    {
    
        _CalendarPaths* calendarPaths = new _CalendarPaths();
        GetUserCalendar(EMail,calendarPaths);
        _bstr_t bstrURLItem = calendarPaths->CalendarURL;
        _ConnectionPtr m_Connection = calendarPaths->getConnection(pConfig.m_pGIT);
        delete calendarPaths;
        

            try
            {
                hr = pRecordset->Open(variant_t(sQuery1+sQuery2),                                                 
                                                variant_t((IDispatch*)m_Connection, true),
                                                adOpenUnspecified,
                                                adLockUnspecified,
                                                -1);
            }
            catch(_com_error error)
            {
                CString csErr = (LPSTR) error.ErrorMessage();
                TRACER.Print(LOG_ERROR,_T("CCreateAppointment::SelectAppointments, Error when opening recordse \n"));                          return false;
            }



да, там и создается. дело не в нем, потому что в этом потоке при вызове другой функции при сохранении объекта используя Connection,
программа выдает такую же ошибку.

кстати, попробовал передавать в поток и GIT (об этом писал в одном из предыдущих сообщений), это тоже не помогло.


hr = iAppointment->DataSource->SaveToContainer(bstrURLItem,
                            variant_t( (IDispatch*)m_Connection, true),
                            adModeReadWrite,
                            adCreateNonCollection,
                            adOpenSource,
                            bstr_t(),
                            bstr_t()
                            );



Пока я сделал чтобы Connection's создавались вручную в каждом потоке, вроде работает. Но конечно хотелось бы узнать где же все-таки баг.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.