¿Qué está causando mi OLEDbException, IErrorInfo.GetDescription falló con E_FAIL(0x80004005)
ms-access oledbconnection (3)
Estoy usando un OleDbConnection, OldDbCommand y OleDbReader contra una base de datos de Access.
Tengo una consulta con nombre en la base de datos a la que llamo desde el código.
La consulta funciona correctamente cuando se ejecuta desde el acceso.
Varios recursos indican que el error puede deberse al uso de palabras reservadas en la consulta y para envolverlos con corchetes. No utilizo ninguna palabra reservada y he incluido todos los nombres de columna entre paréntesis para descartarla.
Tratando de determinar dónde está el problema, simplifiqué la consulta a un simple
SELECT id FROM table1 WHERE id = 5
que la conexión Ole no arroja una excepción.
Cuando presento la siguiente porción de la consulta:
SELECT table1.id FROM table1 INNER JOIN storedQuery ON table1.id = storedQuery.id WHERE table1.id = 5"
entonces obtengo la excepción.
Los detalles de la excepción son los siguientes:
- Mensaje: IErrorInfo.GetDescription falló con E_FAIL (0x80004005).
- Código de error: -2147467259
- NativeError: -533136361
- SQLState: 3000
Otra causa posible de esta excepción es si el archivo que intenta cargar / leer no existe.
He encontrado que es útil realizar un "archivo.Existe" antes de intentar abrir el archivo solo para asegurarme de que mi código detecta correctamente esta causa específica de la excepción "IErrorInfo.GetDescription failed with E_FAIL".
Aparentemente estaba equivocado cuando dije que la consulta no contenía palabras reservadas.
La consulta que estaba usando era seleccionar de otra consulta en la Base de datos de acceso. Esa otra consulta tenía una palabra clave reservada que causaba el problema.
Por cierto:
El motor de la base de datos de Access se ejecuta en modos diferentes, según se llame desde Access, objetos de acceso a datos, Microsoft OLE Provider para el motor de base de datos de Access o el controlador ODBC de Microsoft Access. Se puede ejecutar en modo ANSI o en modo no ANSI (tradicional).
Debido a que el uso de estos dos modos da como resultado dos conjuntos de palabras reservadas ligeramente diferentes, una consulta que utiliza una palabra reservada podría funcionar en un modo y fallar en otro modo.
Keith
..y han incluido todos los nombres de columna entre paréntesis para descartarlo.
No solo los nombres de las columnas deben estar rodeados de corchetes. Los nombres de las tablas también deberían ser así. Por ejemplo, reemplace la línea de abajo
SELECT id FROM table1 WHERE id = 5
Con la línea de abajo
SELECT [id] FROM [table1] WHERE [id] = 5