Error “System.Data.OleDb. OleDbException: Error no especificado” en ASP.NET al conectar con una base de datos con Microsoft Jet OleDb 4.0
Publicado por lcflores en 26th Abril 2007
Hay un curioso problema al intentar acceder a un Excel / Access en un servidor Web mediante OLEDB y ASP.NET. Es algo trivial, pero puede haceros perder mucho tiempo. El error se produce al llamar al método “Connection.Open” para abrir una connexion a un fichero Access o Excel con ASP.NET y OleDb. Hay dos posibles causas:
Primera causa: La cuenta ASP.NET/Impersonated no tiene suficientes permisos para crear el fichero ldb.
- Solución: Dar a la cuenta del usuario ASP.NET permisos de escritura/lectura a la carpeta donde está el fichero Excel/Access. Si estas utilizando “impersonation”, tienes que dar a la cuenta “impersonated” los permisos mencionados, es decir, a todos los usuarios que se vayan a conectar (con seguridad Windows).
Segunda causa: La cuenta “Impersonated” no tiene suficientes privilegios para crear los ficheros temporales.
Cuando abres un fichero Excel o Access usando Jet, require la creación de ficheros temporales. Con ASP.NET estos ficheros temporales serán creados en el directorio:
“C:\Documents and Settings\<NombreServidor>\ASPNET\Local Settings\Temp”
Por defecto la cuenta del usuario ASP.NET tiene completo acceso a este directorio. Sin embargo, cuando estas usando “impersonation”, esta cuenta no tendrá acceso por defecto. En consecuencia, el proceso Jet no tendrá acceso a crear ficheros temporales cuando abre una conexión a un fichero Access o Excel con ASP.NET. Debido a esto, OleBd lanza una excepción sin un mensaje específico: “System.Data.OleDb.OleDbException: Error no especificado” o en inglés “System.Data.OleDb.OleDbException: Unspecified error”.
- Solución: Dar permisos totales a la cuenta de “impersonated” a la carpeta mencionada. No está demás mirar el artículo de Microsoft donde encontraréis mas detalles.

26th Abril 2007 a las 12:18
¿y por que mantienes impersonate=true?
26th Abril 2007 a las 15:01
Para poder atentificar y autorizar identificando el usuario de Windows de forma sencilla.
10th Mayo 2007 a las 13:44
[…] Nos hemos mudado, puedes encontrar los últimos comentarios y correcciones al post en: http://www.xperimentos.com […]
21st Noviembre 2007 a las 18:24
Me gustaría saber si en el caso de la primera causa, también es necesario dar permisos a los usuarios de IIS (IWAM, IUSR e IIS_WPG).
También desde que nivel se deben asignar esos permisos, es decir le puedo asignar los permisos exclusivamente a la carpeta donde está el archivo Access o los permisos deben estar desde el comienzo de la ruta? por ejemplo: D:/ejemplo/base/ejemplo.mdb
Ya apliqué los dos puntos anteriores, pero sigue presentándose la excepción con cierta frecuencia. Hay algún aporte para esta situación?
23rd Noviembre 2007 a las 18:22
Hola,
Tratare de responder de la mejor forma posible a cada uno de los puntos que planteas:
1) En principio no. En IIS 6 normalmente no se utiliza IWAN y IIS_WPG es el grupo de administradores donde suele estar IUSR y IWAN, luego con dar permisos a IUSR es suficiente para las carpetas. No obstante en este artículo de Microsoft puedes encontrar más información sobre la correcta configuración de los permisos en IIS 6, http://support.microsoft.com/?id=812614
2) Vale con asignar los permisos en la carpeta donde está el fichero (siempre que se configure como que los objetos hijo tienen que tener exactamente la misma configuración).
3) Lo único que creo que puede pasar es que los ficheros temporales (fichero .ldb en el caso de Access) no puede crearse porque no esten heredando correctamente los permisos. Prueba a asignar en la carpeta padre los permisos e indicar en la configuración avanzada que todos sus objetos hijos deben de heredar los mismos permisos.
Un saludo,
lcflores