Accessデータベースに対してOleDbConnection、OldDbCommand、およびOleDbReaderを使用しています。
コードから呼び出すデータベースに名前付きクエリがあります。
アクセスから実行された場合、クエリは正しく機能します。
いくつかのリソースは、クエリで予約語を使用し、それらを角かっこで囲むことによってエラーが発生する可能性があることを示しています。私は予約語を使用しておらず、除外するためにすべての列名を角かっこで囲んでいます。
問題がどこにあるのかを特定するために、クエリを単純化しました
SELECT id FROM table1 WHERE id = 5
ole接続は例外をスローしません。
クエリの次の部分を紹介すると、
SELECT table1.id FROM table1 INNER JOIN storedQuery ON table1.id = storedQuery.id WHERE table1.id = 5"
その後、例外が発生します。
例外の詳細は次のとおりです。
- メッセージ:IErrorInfo.GetDescriptionがE_FAIL(0x80004005)で失敗しました。
- エラーコード:-2147467259
- NativeError:-533136361
- SQLState:3000
クエリに予約語が含まれていないと私が言ったとき、私は明らかに間違っていました。
私が使用していたクエリは、Accessデータベースの別のクエリから選択していました。その別のクエリには、問題の原因となっている予約済みキーワードが含まれていました。
ところで:
Accessデータベースエンジンは、Access、データアクセスオブジェクト、Microsoft OLE Accessデータベースエンジンのプロバイダー、またはMicrosoft Access ODBCドライバ。ANSIモードまたは非ANSI(従来)モードのいずれかで実行できます。
これらの2つのモードを使用すると、予約語の2つのわずかに異なるセットが生成されるため、予約語を使用するクエリは、あるモードでは機能し、別のモードでは失敗する可能性があります。
キース
..そして、とにかくそれを除外するために、すべてのcolumnの名前を括弧で囲んでいます。
角かっこで囲む必要がある列名だけでなく、テーブル名も必要ですたとえば、次の行を置き換えます
SELECT id FROM table1 WHERE id = 5
以下の行で
SELECT [id] FROM [table1] WHERE [id] = 5
この例外の別の考えられる原因は、ロード/読み取りしようとしているファイルが存在しない場合です。
コードを「IErrorInfo.GetDescriptionがE_FAILで失敗した」という特定の原因を正しく検出することを確認するために、ファイルを開く前に「File.Exists」を実行すると便利です。