我们工作中有一个相当不幸的遗留应用程序,最初是用 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 组件不像他们声称的那样兼容,要么是这个古老的应用程序正在做一些奇怪的事情。
答案1
如果它是一个从桌面运行的应用程序(即不是作为服务运行),您是否尝试将应用程序设置为在兼容模式下运行?我在使用 VB6 程序时遇到了类似的问题(从程序的两个不同部分调用相同的函数来读取注册表,一个可以工作,另一个不可以,但从 VB6 IDE 中两个都可以工作),只需右键单击并让 Win7 测试兼容性并选择 XP SP2 模式即可解决问题。
答案2
XP 模式最终成为唯一可行的解决方案。