我們有一個相當不幸的遺留應用程序,最初是用 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 虛擬機器。
編輯 - 經過多次嘗試後,我們被迫使用 XP VM 作為解決方案。要么 VB 組件並不像他們聲稱的那樣兼容,要么這個古老的應用程式正在做一些有趣的事情。
答案1
如果它是從桌面運行的應用程式(即不是作為服務),您是否嘗試將應用程式設定為在相容模式下運行?我在VB6程式中遇到了類似的問題(從程式的兩個不同部分呼叫相同的函數來讀取註冊表,一個可以工作,另一個不能,但是從VB6 IDE兩者都可以工作),只需右鍵點擊並進行Win7測試為了相容性而選擇XP SP2模式解決了這個問題。
答案2
XP 模式最終成為唯一可行的解決方案。