我们有一个相当不幸的遗留应用程序在工作,它最初是用 VB6 编写的,它比我们 IT 部门的任何人都早了至少 5 年。我们有一个合同开发人员进行持续维护,他可以在哪里将部分重写为 .NET 代码(不确定他的技术,这是他作为 IBM 工程师的日常工作的副业)应用程序运行良好(例如是)在windows XP下。我们只有几台主要用于测试的 Windows 7 机器,而这个应用程序似乎碰壁了。诸如后台未加载和 SQL 错误之类的事情。这甚至在管理员下运行。
从 ODBC 控制面板运行 SQL 跟踪显示了一些有趣的事情。它最初成功地连接到数据库,并在其中运行查询以确定它是否正在运行正确的版本。此查询工作正常。
558-1af0 ENTER SQLExecDirectW
HSTMT 0x020D7548
WCHAR * 0x04C8F0F0 [ 115] "SELECT count(*) c FROM tblSoftwareVersion WHERE fldSoftwareVersion = '123456' AND fldSoftwareName = 'Application.VB'"
SDWORD 115
BMS 558-1af0 EXIT SQLExecDirectW with return code 1 (SQL_SUCCESS_WITH_INFO)
HSTMT 0x020D7548
WCHAR * 0x04C8F0F0 [ 115] "SELECT count(*) c FROM tblSoftwareVersion WHERE fldSoftwareVersion = '123456' AND fldSoftwareName = 'Application.VB'"
SDWORD 115
然后它似乎断开了它的连接并且找不到 ODBC 连接,尽管它连接到同一个数据库。从跟踪来看,它似乎配置了连接,然后它开始触发 SQLFreeStmt 以取消绑定并关闭,然后在应用程序中它尝试做它没有连接的事情。
558-1af0 ENTER SQLFreeStmt
HSTMT 0x020D7548
UWORD 2 <SQL_UNBIND>
BMS 558-1af0 EXIT SQLFreeStmt with return code 0 (SQL_SUCCESS)
HSTMT 0x020D7548
UWORD 2 <SQL_UNBIND>
然后当我尝试做一些提取数据的事情时就会发生这种情况
558-1af0 ENTER SQLDriverConnectW
HDBC 0x020DDA00
HWND 0x00000000
WCHAR * 0x73EF8634 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x73EF8634
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
BMS 558-1af0 EXIT SQLDriverConnectW with return code -1 (SQL_ERROR)
HDBC 0x020DDA00
HWND 0x00000000
WCHAR * 0x73EF8634 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x73EF8634
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
DIAG [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0)
几乎我在这个问题上的所有搜索都出现了连接字符串有问题的编程问题。在这个特定场景中唯一不同的是 Windows 7,我知道连接字符串很好,因为它可以在 XP 机器上运行。VB 组件应该在 Win7 下仍然可以使用。我的电脑运行的是32位win7,我的VP运行的是Win7 64位,两者都有同样的问题,所以可以排除。
我已经尝试重新安装 SQL Native Client 和 VB 运行时以及有问题的应用程序。希望我能找到解决方案,而不必求助于使用 XP VM。
编辑 - 经过多次尝试,我们被迫使用 XP VM 作为解决方案。要么 VB 组件不像他们声称的那样兼容,要么这个古老的应用程序正在做一些有趣的事情。
如果它是从桌面运行的应用程序(即不是作为服务),您是否尝试将应用程序设置为以兼容模式运行?我在 VB6 程序中遇到了类似的问题(读取从程序的两个不同部分调用的注册表的相同功能,一个有效,另一个无效,但从 VB6 IDE 两者都有效)并且只需右键单击并进行 Win7 测试为了兼容性,选择 XP SP2 模式解决了这个问题。
XP 模式最终成为唯一可行的解决方案。