c++ - regsvr32 导致 CDatabase destrucor 在使用 SQL Native Client (v2005) 时挂起

标签 c++ sql-server com+ regsvr32

我在 Visual Studio 2005 中有一个 C++ COM dll,它使用 SQL Server (v2000) 驱动程序连接到数据库 (SQL Server 2005)。我们的数据库团队最近委托(delegate)我们将 SQL Server 驱动程序从 SQL Server (v2000) 升级到 SQL Native Client (v2005) 或 SQL Server Native Client 10.0 (v2007)。

应用程序构建得很好。然后,当我在 DLL 上执行 regsvr32 命令以将其注册为 COM 时,应用程序挂起。当我通过代码进行调试时,我发现在主 APP(继承自 CWinApp)的 InitInstance 中,应用程序使用存储过程将启动消息记录到数据库中。

对该日志消息的调试显示创建了一个执行存储过程的 CDatabase 对象。存储过程正确执行;消息被记录到数据库中,执行返回到 C++ 代码。然后,当 CDatabase 对象关闭时(通过调用 CDatabase::Close()),应用程序挂起。我调试了 CDatabase 代码,发现在 CDatabase::Close() 中调用了

AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));

正是在这个调用中,执行没有返回。调试器返回到(运行)状态并且没有任何返回。当我尝试执行 Debug -> Break All 时,我收到一条消息,指出没有正在运行的线程并且进程可能已死锁。

这仅在调用 REGSVR32 期间发生。如果我为 regsvr32 部分选择 Sql Server 驱动程序,然后将其更改为 Sql Native Client 或 Sql Server Native Client v10.0,应用程序就可以正常工作。

我也在与 Microsoft 就此进行合作,但我们的时间不多了。任何帮助或想法将不胜感激!

谢谢,

最佳答案

下面链接中的那个人似乎已经通过在他的主应用程序中动态加载 ODBC dll 而不仅仅是在 DLL 中加载来解决这个问题。这能以某种方式适用于您的情况吗?

SQLFreeHandle Deadlock Issue?

关于c++ - regsvr32 导致 CDatabase destrucor 在使用 SQL Native Client (v2005) 时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031000/

相关文章:

java - Hibernate slqjdbc4 列带空格

sql-server - 创建 SQL Server View 时可以指定列类型吗?

java - 如何使用免费方法从 Java 执行 COM+ 库

c++ - 根据位数集计算组合

c++ - 如何确定线段是否在多边形内部?

sql - 为什么 SQL Server 全文搜索不匹配数字?

c# - 检查 COM+ 应用程序是否已经在运行?

c++ - Eigen :设置 EIGEN_STACK_ALLOCATION_LIMIT 不起作用

C++ Visual Studio 链接器错误

.net - 将应用程序层拆分为不同的程序集