2013-03-20 19 views
7

Używam OleDbConnection, OldDbCommand i OleDbReader przeciwko bazy danych Access.Co jest przyczyną mojego wyjątku OLEDbException, IErrorInfo.GetDescription nie powiodło się z E_FAIL (0x80004005)

Mam kwerendę o nazwie w bazie danych, który wywołuję z kodu.

Zapytanie działa poprawnie, gdy jest uruchamiane z dostępu.

Kilka zasobów wskazuje, że błąd mógł zostać spowodowany przez użycie słów zarezerwowanych w zapytaniu i zawinięcie ich za pomocą nawiasów. Nie używam żadnych zarezerwowanych słów i zawinąłem w nawiasie wszystkie nazwy kolumn, aby je wykluczyć.

Próbując określić, gdzie problemem jest to, że są uproszczone zapytanie do prostego

SELECT id FROM table1 WHERE id = 5 

którym połączenie Ole nie zgłasza wyjątek.

Kiedy wprowadzi kolejną porcję kwerendy:

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

potem uzyskać wyjątek.

szczegóły Wyjątkiem są następujące:

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

Odpowiedz

9

I najwyraźniej pomylił, kiedy powiedział, że zapytanie nie zawiera żadnych słów zarezerwowanych.

Zapytanie, którego używam, wybierało inne zapytanie z bazy danych programu Access. To inne zapytanie zawierało zastrzeżone słowo kluczowe, które było przyczyną problemu.

BTW:

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

Keith

+0

Out ciekawości, co było zastrzeżonym słowem kluczowym w zapytaniu, które się nie powiodło? – DaveInCaz

+1

Zbyt wiele lat temu, aby pamiętać ... Ważną częścią dla mnie było dowiedzieć się, że istnieją różne słowa rezerwy w zależności od tego, w jaki sposób wywołuje przechowywane zapytania –

2

Inną możliwą przyczyną tego wyjątku jest, jeśli plik próbujesz załadować/odczytu nie istnieje.

Znalazłem użyteczne wykonanie "File.Exists" przed próbą otwarcia pliku, aby upewnić się, że mój kod poprawnie wykrywa tę konkretną przyczynę wyjątku "IErrorInfo.GetDescription failed with E_FAIL".

4

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

Nie tylko kolumny nazwy, które powinny być otoczone nawiasami kwadratowymi Nazwy tabel powinny także Na przykład, wymień poniżej linii

SELECT id FROM table1 WHERE id = 5 

Z poniższej linii

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