2010-01-13 97 views
0

我正在致力于通过ICommand::Execute在MS SQL Server上运行查询的一些OLE DB代码。通过在执行之前在命令上设置DBPROPVAL_ASYNCH_INITIALIZE属性,我将该代码转换为异步操作。Microsoft SQL Server本机客户端是否支持IDBAsynchNotify?

我宁愿注册一个IDBAsynchNotify接收器,以便我的代码可以通知事件,而不是通过轮询或通过ISSAsynchStatus阻止。

documentationICommand::Execute不显示IConnectionPointContainer作为可接受的riid参数,但相同的文档,讨论DB_S_ASYNCHRONOUS返回码时,表明它可以请求IConnectionPointContainer接口,我可以用它来注册我的事件接收器。

当我拨打ICommand::Execute时,通过IID_IConnectionPointContainer作为riid参数,我收到E_NOINTERFACE错误。我还尝试在Execute之前设置DBPROP_IConnectionPointContainer属性,但我收到了相同的结果。

如果必须,我会使用ISSAsynchStatus,但我更愿意使用IDBAsynchNotify。可能吗?

回答

0

根据对this SQL Server Native Client blog post的回应,“异步通知编程模型”是本地客户端请求的第五个最重要的功能。我想这回答了这个问题。希望sqlncli团队能够尽早解决这个问题。我很容易受到投票的困扰。

0

请参阅Performing Asynchronous Operations了解SQL Native Client OLE Db细节,包括示例。该链接表示唯一可接受的RIID是IID_IDBAsynchStatus和IID_ISSAsynchStatus,所以我的理解是编程模型是基于池的,而不是基于通知的。

+0

我以前读过这个文档,而且我从代码中得到的行为肯定会提示这一点。我想我很好奇,是否存在任何与此相矛盾的证据。 – 2010-01-13 03:25:33

+0

我在这里猜测,但你有没有试过要求IID_IUnknown,然后对IID_IConnectionPointContainer的结果使用QueryInterface? – 2010-01-13 04:29:07

+0

刚刚尝试过,结果相同:E_NOINTERFACE。 – 2010-01-14 18:01:29

相关问题