使用SQL Native Client时,regsvr32导致CDatabase destrucor挂起(v2005)

时间:2012-04-05 14:56:42

标签: c++ sql-server com+ regsvr32

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

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

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

AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));

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

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

我也正在与微软合作,但我们已经没时间了。任何帮助或想法都会大大鼓励!

谢谢,

1 个答案:

答案 0 :(得分:0)

下面链接中的人似乎已经通过在他的主APP中动态加载ODBC dll来解决它,而不仅仅是在DLL中。这可能在某种程度上适用于您的情况吗?

SQLFreeHandle Deadlock Issue?