注意: ADO および ADO MD は、Microsoft .NET Framework 環境では十分にテストされていません。 これらは、特にサービス ベースのアプリケーションやマルチスレッド アプリケーションで断続的な問題を引き起こす可能性があります。 この記事で説明する方法は、ADO.NET への移行中の一時的な手段としてのみ使用する必要があります。 これらの方法は、完全なテストを実施して互換性の問題がないことを確認した後にのみ使用してください。 このように ADO または ADO MD を使用することで発生する問題は、サポートされません。 詳細については、以下のサポート技術情報を参照してください。
840667 .NET Framework アプリケーションで ADO および ADO MD を使用すると、予期しないエラーが発生する
現象
次のような状況を想定します。 Windows 7 Service Pack 1 (SP1) または Windows Server 2008 R2 SP 1 を実行しているコンピューター、または KB9823246 がインストールされているコンピューターでは、次のいずれかのアプリケーションを使用して Microsoft ActiveX Data Objects (ADO) アプリケーションを再コンパイルします。
- Microsoft Visual C++
- Microsoft Visual Basic for Applications (VBA)
- Microsoft Visual Basic 6
- Microsoft .NET アプリケーション
このシナリオでは、アプリケーションは下位レベルのオペレーティング システムでは実行されないことがわかります。 たとえば、リリース版の Windows 7、Windows Vista、およびそれ以前のバージョンの Windows では動作しません。 実装によっては、次のいずれかのようなエラー メッセージも表示されることがあります。 (他のエラー メッセージが表示される場合があります。)
エラー メッセージ 1
注
REGDB_E_CLASSNOTREG (0x80040154)
エラー メッセージ 2
注
E_POINTER (0x80004003)
エラー メッセージ 3
注
E_NOINTERFACE (0x80004002)
エラー メッセージ 4
注
種類 'System.__ComObject' の COM オブジェクトをインターフェイスの種類 'ADODB' にキャストできません。Connection' です。 IID '{00001550-0000-0010-8000-00AA006D2EA4}' のインターフェイスの COM コンポーネントに対する QueryInterface 呼び出しが次のエラーにより失敗したため、この操作は失敗しました: そのようなインターフェイスはサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))."
次の Visual C++ コード セグメントでは、この問題が再現されています。
#import " msado15.dll" no_namespace rename("EOF","EndOfFile")
int main()
{
CoInitialize(NULL);
_ConnectionPtr pConnection = NULL;
HRESULT hr = pConnection.CreateInstance(__uuidof(Connection)); //hr gets E_NOINTERFACE here
}
次の Visual Basic for Applications コード セグメントでは、この問題が再現されています。
Private Sub Form_Load()
Dim Conn As New ADODB.Connection ‘Runtime error here: Class does not support Automation or does not support expected interface
End Sub
VBA エラー: 実行時エラー '430': クラスがオートメーションをサポートしていないか、必要なインターフェイスをサポートしていません
注: マイクロソフトは、ADO 用のプライマリ相互運用機能アセンブリをサポートしなくなり、Visual Basic 6 もサポートされなくなりました。 Visual Basic 6 のサポートに関する詳細については、次の MSDN Web ページを参照してください。
Windows Vista、Windows Server 2008、および Windows 7 上の Visual Basic 6.0 のサポートに関する声明 ADO のサポートの容易さのためのプライマリ相互運用アセンブリの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。
318559 Visual Studio .NET での ADO 用プライマリ相互運用アセンブリ (ADODB) の使用
原因
この問題が発生する原因は、一部の ADO インターフェイスが新しいインスタンス識別子 (IID) に関連付けられるように Windows 7 SP1 で変更されたことが原因です。 古い IID インターフェイスには、次のサフィックスが割り当てられていました。
_Deprecated たとえば、インターフェイス _Connectionは次のように更新されました。
- Windows 7 およびそれ以前のバージョンの Windows では、_Connection IID は 00000550-0000-0010-8000-00AA006D2EA4 です。
- Windows 7 SP1 では、_Connection IID は 00001550-0000-0010-8000-00AA006D2EA4 で、_Connection_Deprecated の IID は 00000550-0000-0010-8000-00AA006D2EA4 です。
アプリケーションで _Connection への早期バインドを使用する場合、新しい IID はコンパイル中にアプリケーション バイナリに保存されます。 これにより、IID が存在しないため、アプリケーションが下位レベルのオペレーティング システムで実行されている場合にエラーが発生します。
ADO 2.7 以降のバージョンでは、一部の ADO API はプラットフォームに依存しています。 64 ビット版の Windows では、これらの ADO API は 64 ビットのデータ型 (LONGLONG データ型など) を使用して引数を処理します。 ただし、これらの API を使用するアプリケーションでは、依然として LONG データ型が使用されます。 そのため、マクロを実行しようとすると "型が一致しません" というエラー メッセージが表示されます。
解決策
この問題を解決するには、以下のマイクロソフト サポート技術情報に記載されている更新プログラムのいずれかをインストールしてください。
2640696 Windows 7 SP1 または Windows Server 2008 R2 SP1 でコンパイルされた ADO ベースのアプリケーションが、以前のバージョンの Windows では実行されない
追加情報
Windows 7 SP1 ADO GUID の変更に関するより良いソリューション