web-dev-qa-db-ja.com

OLEDbException、IErrorInfo.GetDescriptionの原因はE_FAIL(0x80004005)で失敗しました

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
12
Keith Sirmons

クエリに予約語が含まれていないと私が言ったとき、私は明らかに間違っていました。

私が使用していたクエリは、Accessデータベースの別のクエリから選択していました。その別のクエリには、問題の原因となっている予約済みキーワードが含まれていました。

ところで:

Accessデータベースエンジンは、Access、データアクセスオブジェクト、Microsoft OLE Accessデータベースエンジンのプロバイダー、またはMicrosoft Access ODBCドライバ。ANSIモードまたは非ANSI(従来)モードのいずれかで実行できます。

これらの2つのモードを使用すると、予約語の2つのわずかに異なるセットが生成されるため、予約語を使用するクエリは、あるモードでは機能し、別のモードでは失敗する可能性があります。

Access 2007の予約語と記号

キース

13
Keith Sirmons

..そして、とにかくそれを除外するために、すべてのcolumnの名前を括弧で囲んでいます。

角かっこで囲む必要がある列名だけでなく、テーブル名も必要ですたとえば、次の行を置き換えます

SELECT id FROM table1 WHERE id = 5

以下の行で

SELECT [id] FROM [table1] WHERE [id] = 5
8
Gouda

この例外の別の考えられる原因は、ロード/読み取りしようとしているファイルが存在しない場合です。

コードを「IErrorInfo.GetDescriptionがE_FAILで失敗した」という特定の原因を正しく検出することを確認するために、ファイルを開く前に「File.Exists」を実行すると便利です。

2