Microsoft SQL Server本机客户端是否支持IDBAsynchNotify?
我正在致力于通过ICommand::Execute
在MS SQL Server上运行查询的一些OLE DB代码。通过在执行之前在命令上设置DBPROPVAL_ASYNCH_INITIALIZE
属性,我将该代码转换为异步操作。Microsoft SQL Server本机客户端是否支持IDBAsynchNotify?
我宁愿注册一个IDBAsynchNotify
接收器,以便我的代码可以通知事件,而不是通过轮询或通过ISSAsynchStatus
阻止。
的documentation为ICommand::Execute
不显示IConnectionPointContainer
作为可接受的riid
参数,但相同的文档,讨论DB_S_ASYNCHRONOUS
返回码时,表明它可以请求IConnectionPointContainer
接口,我可以用它来注册我的事件接收器。
当我拨打ICommand::Execute
时,通过IID_IConnectionPointContainer
作为riid
参数,我收到E_NOINTERFACE
错误。我还尝试在Execute
之前设置DBPROP_IConnectionPointContainer
属性,但我收到了相同的结果。
如果必须,我会使用ISSAsynchStatus
,但我更愿意使用IDBAsynchNotify
。可能吗?
根据对this SQL Server Native Client blog post的回应,“异步通知编程模型”是本地客户端请求的第五个最重要的功能。我想这回答了这个问题。希望sqlncli团队能够尽早解决这个问题。我很容易受到投票的困扰。
请参阅Performing Asynchronous Operations了解SQL Native Client OLE Db细节,包括示例。该链接表示唯一可接受的RIID是IID_IDBAsynchStatus和IID_ISSAsynchStatus,所以我的理解是编程模型是基于池的,而不是基于通知的。
我以前读过这个文档,而且我从代码中得到的行为肯定会提示这一点。我想我很好奇,是否存在任何与此相矛盾的证据。 – 2010-01-13 03:25:33
我在这里猜测,但你有没有试过要求IID_IUnknown,然后对IID_IConnectionPointContainer的结果使用QueryInterface? – 2010-01-13 04:29:07
刚刚尝试过,结果相同:E_NOINTERFACE。 – 2010-01-14 18:01:29