職場にかなり残念なレガシー アプリケーションがあります。これは元々 VB6 で書かれており、IT 部門の誰よりも 5 年以上前に遡ります。継続的なメンテナンスのために契約開発者がいて、可能な場合はセクションを .NET コードに書き換えています (ここでの彼のテクニックはよくわかりません。これは IBM エンジニアとしての通常の仕事の副業です)。アプリケーションは Windows XP で問題なく動作します (現状のまま)。テスト用に Windows 7 マシンが 2 台あるだけですが、このアプリケーションは壁にぶつかっているようです。バックグラウンドが読み込まれなかったり、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
その後、接続が切断され、同じ DB に接続しているにもかかわらず、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 は 64 ビット Win7 を実行していますが、どちらも同じ問題が発生するため、その可能性は排除できます。
すでに、SQL Native Client と VB ランタイム、および問題のアプリケーションの再インストールを試みています。うまくいけば、解決策が見つかり、XP VM を使用する必要がなくなるでしょう。
編集 - 何度も試した結果、解決策として XP VM を使用するしかありませんでした。VB コンポーネントが主張するほど互換性がないか、この古いアプリが何かおかしなことをしているかのどちらかです。
答え1
デスクトップから実行されるアプリケーション (つまり、サービスとしてではない) の場合、アプリケーションを互換モードで実行するように設定してみましたか? VB6 プログラムで同様の問題が発生しました (レジストリを読み取る同じ関数がプログラムの 2 つの異なる部分から呼び出され、1 つは機能し、もう 1 つは機能しませんが、VB6 IDE からは両方とも機能します)。右クリックして Win7 で互換性をテストし、XP SP2 モードを選択するだけで、問題は解決しました。
答え2
結局、XP モードが唯一機能する解決策でした。