regsvr32 会导致 CDatabase destrucor 在使用 SQL Native Client (v200
regsvr32 causes CDatabase destrucor to hang when using SQL Native Client (v2005)
中有一个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 时,应用程序挂起。当我调试代码时,我发现在主应用程序(继承自 CWinApp)的 InitInstance 中,应用程序使用存储过程将启动消息记录到数据库中。
调试该日志记录消息会显示已创建执行存储过程的 CDatabase 对象。存储过程正确执行;消息被记录到数据库中,执行返回到C++代码。然后,当 CDatabase 对象关闭时(通过调用 CDatabase::Close()),应用程序挂起。我调试了 CDatabase 代码,发现在 CDatabase::Close() 中调用了
AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));
在此调用中,执行不会返回。调试器返回到"(正在运行)"状态,但不会返回任何内容。当我尝试执行调试 -> 全部中断时,我收到一条消息,指出没有正在运行的线程并且进程可能已死锁。
这仅在调用REGSVR32期间发生。如果我为 regsvr32 部分选择 Sql Server 驱动程序,然后将其更改为 Sql Native Client 或 Sql Server Native Client v10.0,则应用程序运行良好。
我也在与Microsoft合作,但我们的时间不多了。任何帮助或想法将不胜感激!
谢谢
下面链接中的家伙似乎已经通过在他的主应用程序中动态加载 ODBC dll 而不仅仅是在 DLL 中解决了这个问题。这可以以某种方式适用于您的情况吗?
SQLFreeHandle 死锁问题?
- 如何使用c++在VS 2019上运行SQL查询
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- Android Java USB for native cpp
- 在C++中调用 MS SQL 存储过程
- 尝试创建表会给出 SQL 逻辑错误
- 在 MySQL/Connector C++中使用 SQL 联接
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- PostgresSQL - SQL Ready 语句与字符串转义,防止 SQL 注入攻击
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 使用 SQLConfig数据源创建 SQL Server DSN 失败:关键字-值对无效
- 使用 Qt5 SQL 进行异步数据库访问的策略
- Qt/SQL - 从 QSqlQuery exec Stored Procedure 获取列类型和名称?
- 如何将QTime保存在SQL Server Express表中并读回?
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- 使用 python 或 c ++ 中的 sql 根据输入数据输出输出示例
- regsvr32 会导致 CDatabase destrucor 在使用 SQL Native Client (v200
- 何时可以安全地以编程方式卸载SQL Server Native Client
- SQLExecute 始终以超过 8k 大小的参数返回"[Microsoft][SQL Server Native Client 10.0]String data, right truncation"