Здравствуйте, народ! У меня на 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. Все превосходно, только никаких сообщений не приходит Перерыл все свойства 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]
|