2013-03-20 48 views
7

OleDbConnection、OldDbCommand、およびOleDbReaderをAccessデータベースに対して使用しています。私のOLEDbExceptionが原因で、IErrorInfo.GetDescriptionがE_FAIL(0x80004005)で失敗しました

私はコードから呼び出すデータベースに名前付きのクエリを持っています。

アクセスが実行されたときにクエリが正しく機能します。

いくつかのリソースは、クエリで予約語を使用し、それらを括弧で囲むことによってエラーが発生する可能性があることを示しています。私は予約語を使用しておらず、括弧内のすべての列名をラップしてしまいました。問題がどこにあるかを決定しようと

、私はオレの接続が例外をスローしない単純な

SELECT id FROM table1 WHERE id = 5 

にクエリを簡素化しています。

私は、クエリの次の部分を導入する場合:

SELECT table1.id FROM table1 INNER JOIN storedQuery ON table1.id = storedQuery.id WHERE table1.id = 5" 

を、私は例外を取得。次のように

例外の詳細は以下のとおりです。

  • Message: IErrorInfo.GetDescription failed with E_FAIL(0x80004005).
  • ErrorCode: -2147467259
  • NativeError: -533136361
  • SQLState: 3000

答えて

9

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

私が使用していたクエリは、Accessデータベースの別のクエリから選択していました。その他のクエリには、問題を引き起こしていた予約済みのキーワードがありました。ところで

:ファイルが存在しない/読み込みをロードしようとしている場合

The Access database engine runs in different modes, depending on whether it is called from Access, data access objects, the Microsoft OLE Provider for the Access database engine, or the Microsoft Access ODBC driver. It can be run in either ANSI mode or non-ANSI (traditional) mode.

Because using these two modes results in two slightly different sets of reserved words, a query that uses a reserved word might work in one mode and fail in another mode

Access 2007 reserved words and symbols

キース

+0

アウトを以下の行

SELECT id FROM table1 WHERE id = 5 

を交換する必要があります好奇心の中で、失敗したクエリの予約されたキーワードは何ですか? – DaveInCaz

+1

あまりにも数年前に覚えています。私にとって重要な部分は、保存されたクエリをどのように呼び出すかに応じて異なる予約語があることを知ることでした –

2

この例外の別の原因があります。

ファイルを開く前に "File.Exists"を実行して、 "IErrorInfo.GetDescriptionがE_FAILで失敗しました"という例外の原因をコードが正しく検出したことを確認すると便利です。角括弧で囲む必要があり

4

..and have wrapped all column names in brackets anyway to rule it out.

だけでなく、列名 表名も同様に 例えば、以下の行で

SELECT [id] FROM [table1] WHERE [id] = 5 
関連する問題