如何使用 ATL/MSOLEDBSQL 启用连接资源池?

Posted

技术标签:

【中文标题】如何使用 ATL/MSOLEDBSQL 启用连接资源池?【英文标题】:How to enable connection resource pooling with ATL/MSOLEDBSQL? 【发布时间】:2019-11-01 18:21:03 【问题描述】:

我有 ATL 代码来打开启用了连接资源池的 sql 连接。


    CDBPropSet  dbinit;
    dbinit[0].SetGUID(DBPROPSET_DBINIT);
    dbinit[0].AddProperty(DBPROP_INIT_OLEDBSERVICES, (long)DBPROPVAL_OS_ENABLEALL);
    CDataSource::OpenWithServiceComponents ("SQLNCLI11", dbinit, 1);

编辑 我正在从 SQLNCLI 迁移到 MSOLEDBSQL,以便启用 MULTISUBNETFAILOVER 选项。但是当使用 MSOLEDBSQL 作为 MULTISUBNETFAILOVER 的提供者调用 CDataSource::OpenWithServiceComponents 时出现错误。

    CDBPropSet  dbinit[2];
    dbinit[0].SetGUID(DBPROPSET_DBINIT);
    dbinit[0].AddProperty(DBPROP_INIT_OLEDBSERVICES, (long)DBPROPVAL_OS_ENABLEALL);
    dbinit[1].SetGUID(DBPROPSET_SQLSERVERDBINIT);
    dbinit[1].AddProperty(SSPROP_INIT_MULTISUBNETFAILOVER, VARIANT_TRUE));
    CDataSource db;
    db.OpenWithServiceComponents ("MSOLEDBSQL", dbinit, 2);

    HR=0x80040e21, EXCEPTION_UNKNOWN (0x80040E21), No error info available.

如何在启用 MULTISUBNETFAILOVER 的同时启用 ATL/MSOLEDBSQL 连接资源池?

【问题讨论】:

您有最新版本的 SQL Server 的 OLE DB 驱动程序吗?docs.microsoft.com/en-us/sql/connect/oledb/… 您需要 18.0.2 或更高版本 是的,我正在使用上述链接中的最新驱动程序。当我在 ATLDBCLI 代码 - DB_S_ERRORSOCCURRED Multiple-step operation completed with one or more errors. Check each status value 中进行调试时,我收到了这个错误。我看到 dwstatus 值为 0。 还要添加,CDataSource::Open 返回成功。只有CDataSource::OpenWithServiceComponents 返回失败。 SSPROP_INIT_MULTISUBNETFAILOVER 在 DBPROPSET_SQLSERVERDBINIT 中,而不在 DBPROPSET_DBINIT 中 是的。我用 DBPROPSET_SQLSERVERDBINIT 对其进行了初始化。我错过了我提供的样本。现在编辑它以包含相同的 【参考方案1】:

这是由于CDBPropSet 工具类附带的AddProperty 实用方法。您使用 VARIANT_TRUE 这是 OLEDB 的正确值,但它会强制 C++ 编译器使用此重载,因为 VARIANT_TRUE 很短:

bool AddProperty(DWORD dwPropertyID, short nValue, DBPROPOPTIONS propoptions);

所以,只需使用真正的 C++ 布尔值,如下所示:

dbinit[1].AddProperty(SSPROP_INIT_MULTISUBNETFAILOVER, true));

实用程序类将传递一个 VARIANT_TRUE...

【讨论】:

以上是关于如何使用 ATL/MSOLEDBSQL 启用连接资源池?的主要内容,如果未能解决你的问题,请参考以下文章

批处理如何禁用本地连接同时启用无线连接

SAP ABAP 如何启用SSL HTTPS连接

如何在 Laravel 的 PHPUnit 中启用 Redis 连接

如何判断“移动网络数据”是启用还是禁用(即使通过 WiFi 连接)?

Google Data Studio:如何使用 2 KEYS 为 API 连接器启用身份验证

Android:如何以编程方式启用/禁用 Wifi 或 Internet 连接