Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OLE DB & SQL Server 2005, возможна ли нотификация? 
:(
    Опции темы
Dart
Дата 7.7.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

Репутация: нет
Всего: 2



Здравствуйте, народ!
У меня на SQL Server таблица, которую просматривают несколько пользователей в режиме "справочника", назову его так, т.е. одновременно все записи, и кроме этого могую изменять там данные.  Т.о. при изменении данных мне надо, чтобы провайдер сообщил об этом приложению.
Долго и нудно в MSDN читал о нотификации в OLE DB, результатом чего явился такой код:
Код

class CNotifier : public CCmdTarget
{
public:
    CNotifier() { m_pParentWnd = NULL; }
    void SetParentWnd(CWnd* pParentWnd) { m_pParentWnd = pParentWnd; }
    BEGIN_INTERFACE_PART(RowsetNotify, IRowsetNotify)
        STDMETHOD(OnFieldChange)(IRowset* pRowset, HROW hRow, DBORDINAL cColumns, DBORDINAL rgColumns[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
        STDMETHOD(OnRowChange)(IRowset* pRowset, DBCOUNTITEM cRows, const HROW rghRows[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
        STDMETHOD(OnRowsetChange)(IRowset* pRowset, DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
    END_INTERFACE_PART(RowsetNotify)
    CWnd* m_pParentWnd;
    DECLARE_INTERFACE_MAP()
};


Код

BEGIN_INTERFACE_MAP(CNotifier, CCmdTarget)
    INTERFACE_PART(CNotifier, IID_IRowsetNotify, RowsetNotify)
END_INTERFACE_MAP()

ULONG FAR EXPORT CNotifier::XRowsetNotify::AddRef()
{
    METHOD_PROLOGUE(CNotifier, RowsetNotify)
    return pThis->ExternalAddRef();
}

ULONG FAR EXPORT CNotifier::XRowsetNotify::Release()
{
    METHOD_PROLOGUE(CNotifier, RowsetNotify)
    return pThis->ExternalRelease();
}

HRESULT FAR EXPORT CNotifier::XRowsetNotify::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
    METHOD_PROLOGUE(CNotifier, RowsetNotify)
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}


HRESULT FAR EXPORT CNotifier::XRowsetNotify::OnFieldChange(IRowset* pRowset, HROW hRow, DBORDINAL cColumns, DBORDINAL rgColumns[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny)
{
    METHOD_PROLOGUE(CDynamicColumnArrayNotifier, RowsetNotify)
    HRESULT hr = S_OK;
// и так далее

В классе CRowset:
Код

template < class TAccessor >
class CNotifyRowset : public CRowset<TAccessor>
{
public:
    CNotifyRowset() {}
    HRESULT Advise()
    {
        IID iUNK = IID_IUnknown;
        ULONG elem;
        IUnknown* pUnk;
        HRESULT hr;
        CComPtr<IConnectionPointContainer> spConPtContainer;
        CComPtr<IEnumConnectionPoints>     spEnumConnPoint;
        CComPtr<IConnectionPoint>          spConnPoint;
        hr = m_spRowset->QueryInterface(&spConPtContainer);
        if (FAILED(hr)) return hr;
        hr = spConPtContainer->EnumConnectionPoints(&spEnumConnPoint);
        if (FAILED(hr)) return hr;
        hr = spEnumConnPoint->Next(1, &spConnPoint, &elem);
        if (FAILED(hr)) return hr;
        hr = m_Notifier.ExternalQueryInterface(&iUNK, (void FAR* FAR*) &pUnk);
        if (FAILED(hr)) return hr;
        return spConnPoint->Advise(pUnk, &m_dwCookie);
    }
    HRESULT UnAdvise()
    {
        ULONG elem;
        HRESULT hr;
        CComPtr<IConnectionPointContainer> spConPtContainer;
        CComPtr<IEnumConnectionPoints>     spEnumConnPoint;
        CComPtr<IConnectionPoint>          spConnPoint;
        hr = m_spRowset->QueryInterface(&spConPtContainer);
        if (FAILED(hr)) return hr;
        hr = spConPtContainer->EnumConnectionPoints(&spEnumConnPoint);
        if (FAILED(hr)) return hr;
        hr = spEnumConnPoint->Next(1, &spConnPoint, &elem);
        if (FAILED(hr)) return hr;
        return spConnPoint->Unadvise(m_dwCookie);
    }

protected:
    CNotifier m_Notifier;
    DWORD m_dwCookie;
};

Все вызывается, все возвращает S_OK. Все превосходно, только никаких сообщений не приходит smile 
Перерыл все свойства DBPROP_ROWSET - ну нет там явного указания на то, что надо какой-то флажок поставить.
А, да строка подключения:
Код

L"Provider=SQLOLEDB.1;Password=11111;Persist Security Info=True;User ID=test;Initial Catalog=Test;Data Source=SERVER2;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=ADMIN;Use Encryption for Data=False;Tag with column collation when possible=False"

Даже не представляю, куда еще возможно рыть.

У кого какие мысли?  

Это сообщение отредактировал(а) Dart - 7.7.2006, 10:12
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.