Win7 でのレガシー VB6 アプリケーションの SQL エラー

Win7 でのレガシー VB6 アプリケーションの SQL エラー

職場にかなり残念なレガシー アプリケーションがあります。これは元々 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 モードが唯一機能する解決策でした。

関連情報