Conectar con Access usando System.Data.OleDb en PowerShell

Última actualización: 15/10/2025
Autor: Isaac
  • Instala y valida el proveedor ACE (Microsoft.ACE.OLEDB) y cuadra la arquitectura con PowerShell.
  • Verifica proveedores en el Registro, prueba con un archivo UDL y corrige ProgID/CLSID si falla.
  • Usa System.Data.OleDb y OleDbDataAdapter para cargar/actualizar datos de Access de forma fiable.
  • Automatiza scripts sin prompts usando cuentas de servicio y credenciales seguras en PowerShell.

Conexión Access OleDb PowerShell

Si has intentado abrir una base de datos de Access desde PowerShell y te has encontrado con el mensaje «No se puede encontrar el proveedor. Puede que no esté instalado correctamente», no estás solo. Ese error es muy común y suele tener dos culpables habituales: el proveedor OLE DB de Access (ACE) no está instalado o hay un conflicto de arquitectura entre PowerShell de 32/64 bits y el controlador instalado.

En esta guía vas a aprender, con detalle y sin rodeos, cómo conectar a Microsoft Access usando System.Data.OleDb en PowerShell, cómo validar que los proveedores OLE DB están bien instalados (incluyendo sus claves de Registro, ProgID y DLL), cómo probar fácilmente con un archivo UDL, y cómo automatizar consultas y credenciales para que tus scripts funcionen en segundo plano sin intervención. Además, veremos el papel de OleDbDataAdapter y las diferencias entre OLE DB, ODBC, ADO y ADO.NET para que no vuelvas a ir a ciegas.

Por qué aparece el error del proveedor en PowerShell

El mensaje de error típico al intentar abrir Access desde PowerShell con OLE DB es: «No se puede encontrar el proveedor». Aparece cuando el proveedor ACE de Access no existe en el sistema, está mal registrado o la arquitectura no coincide (por ejemplo, tienes instalado ACE de 32 bits y ejecutas PowerShell de 64 bits, o al revés).

Para Access, el proveedor que necesitas es Microsoft.ACE.OLEDB. Las versiones más frecuentes son Microsoft.ACE.OLEDB.12.0 y Microsoft.ACE.OLEDB.16.0 (instaladas con el Microsoft Access Database Engine/Office). Si tu base es .mdb antigua, también puedes usar Microsoft.Jet.OLEDB.4.0 en sistemas que aún lo soporten, aunque hoy en día ACE es la apuesta más segura para .mdb y .accdb.

Evita confundirlo con los proveedores OLE DB de SQL Server. MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server) y SQLNCLI (SQL Server Native Client) son para SQL Server, no para Access. Para Access necesitas ACE; para SQL Server, MSOLEDBSQL es el recomendado hoy en día.

Instalación, arquitectura y primeras pruebas

Antes de escribir código, confirma que tienes instalado el proveedor correcto y que la arquitectura coincide. Si ejecutas PowerShell x64, el proveedor ACE debe ser x64; si vas a usar PowerShell x86, necesitarás ACE de 32 bits. El cruce de arquitecturas es el origen de la mayoría de errores.

Una forma rapidísima de comprobar proveedores OLE DB disponibles en el equipo es crear un archivo UDL. Un .udl te muestra los proveedores instalados y prueba conexiones sin escribir una línea de código.

Pasos para usar un UDL: crea un archivo de texto y renómbralo a Prueba.udl (asegúrate de ver extensiones). Haz doble clic, ve a la pestaña de proveedor y localiza Microsoft Office 12.0 Access Database Engine OLE DB Provider o similar. En la pestaña de conexión, indica el archivo .accdb/.mdb y pulsa Probar conexión. Si funciona aquí, tu problema no es el driver, sino la cadena de conexión o la arquitectura/permiso del proceso donde ejecutas PowerShell.

Validación de proveedores OLE DB con PowerShell y Registro

Para SQL Server, puedes validar la presencia de MSOLEDBSQL (versiones 18/19) y SQLNCLI con comandos de PowerShell que inspeccionan el Registro con Get-ItemProperty en PowerShell. Estos checks son útiles para entornos mixtos donde conviven Access y SQL Server.

Ejecuta PowerShell como administrador y utiliza, por ejemplo, estas consultas para MSOLEDBSQL (SQL Server):

Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" | \
  Where-Object { $_.Name -like "*MSOLEDBSQL*" } | \
  ForEach-Object { Get-ItemProperty $_.PSPath }

Si conviven varias versiones, verás salidas con InstalledVersion para 18.x y 19.x, tanto en ramas de 64 bits como en Wow6432Node (32 bits). Para el antiguo SQLNCLI (SQL Server Native Client), puedes verificar con:

Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" | \
  Where-Object { $_.Name -like "*SQLNCLI*" } | \
  ForEach-Object { Get-ItemProperty $_.PSPath }

Para Access, el ProgID a buscar es Microsoft.ACE.OLEDB.12.0 o Microsoft.ACE.OLEDB.16.0. Puedes rastrearlos bajo HKEY_CLASSES_ROOT (HKCR). El ProgID se mapea a un CLSID y a la DLL real del proveedor:

  • HKCR\Microsoft.ACE.OLEDB.12.0\CLSID
  • HKCR\CLSID\{CLSID}\InProcServer32
  • En 32 bits sobre un Windows x64: HKCR\Wow6432Node\CLSID\{CLSID}\InProcServer32
  Cómo usar Copilot para aprendizaje en la vuelta al cole

Si el ProgID no existe o el InProcServer32 no apunta a una DLL válida, el proveedor está mal instalado. Reinstala el Access Database Engine que corresponda a tu arquitectura o registra manualmente la DLL con regsvr32 si aplica.

ProgID, CLSID y registro manual con Regsvr32

En COM, un ProgID como Microsoft.ACE.OLEDB.12.0 apunta a un CLSID (GUID). Ese GUID se usa para hallar la ubicación de la DLL en InProcServer32. Si la clave no existe o la ruta es incorrecta, el proveedor no se puede cargar desde PowerShell. En instalaciones mixtas, comprueba la rama Wow6432Node para los proveedores de 32 bits.

Para registrar manualmente una DLL COM usas Regsvr32. Debes ejecutar la versión de regsvr32 que coincida con la DLL (x86/x64) desde un símbolo de sistema elevado. Un ejemplo genérico para proveedores OLE DB sería:

regsvr32 "C:\\Ruta\\A\\ProveedorAce.dll"

En el caso de proveedores de SQL Server (no de Access), también podrías registrar sqlncli11.dll, aunque hoy lo sensato es migrar a MSOLEDBSQL. La compatibilidad con proveedores no Microsoft se limita a verificar ProgID→CLSID y que la DLL existe donde dice el Registro.

Conectar a Access con System.Data.OleDb en PowerShell

La manera más robusta de trabajar desde PowerShell moderno es utilizar el proveedor .NET de OLE DB, es decir, System.Data.OleDb. Con él creas una OleDbConnection, una OleDbCommand y, si quieres volcar resultados en memoria, un OleDbDataAdapter.

Ejemplo básico (abrir, consultar y cerrar) usando ACE para un .accdb:

$dbPath = "C:\\Datos\\MiBase.accdb"
$cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbPath;Persist Security Info=False;"

$cn  = New-Object System.Data.OleDb.OleDbConnection $cs
$cmd = New-Object System.Data.OleDb.OleDbCommand
$cmd.Connection  = $cn
$cmd.CommandText = "SELECT TOP 5 * FROM Clientes"
$adp = New-Object System.Data.OleDb.OleDbDataAdapter $cmd
$tbl = New-Object System.Data.DataTable

$cn.Open()
$adp.Fill($tbl)
$cn.Close()

$tbl | Format-Table -AutoSize

Si necesitas solo probar apertura/cierre, puedes abrir la conexión y cerrarla sin más. Si esto falla, el problema está en el proveedor o la cadena. Para .mdb antiguos también puedes probar:

$cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Datos\\Antigua.mdb;"

Si tu archivo de Access tiene contraseña del propio motor, añade el atributo Jet OLEDB:Database Password en la cadena. Ojo, esto es diferente de credenciales de servidor, porque Access es un archivo local: el control de acceso es a nivel de archivo y proveedor.

Probar conectividad con un archivo UDL y extraer la cadena de conexión

Un UDL no solo sirve para listar proveedores: también permite guardar la cadena de conexión. Abre el .udl con el Bloc de notas y verás una sección con la Connection String que podrás copiar a PowerShell.

Ejemplos típicos de cadenas UDL para SQL Server (no para Access) son del estilo:
Provider=MSOLEDBSQL.1;Integrated Security=SSPI;Data Source=localhost;Initial Catalog=master; o Provider=SQLNCLI11.1;User ID=sa;Data Source=tcp:Servidor,1433;Initial Catalog=AdventureWorks;. Para Access, el patrón es el que viste con ACE: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Ruta\\Base.accdb;

Automatizar scripts y credenciales: cero clics

Cuando programas tareas desatendidas en el Programador de Tareas, no quieres diálogos emergentes ni prompts de credenciales. En Access, normalmente no hay UID/PWD de servidor como en SQL; es un archivo. Aun así, puedes necesitar credenciales de red para acceder a una ruta UNC o proteger la cadena si incluye contraseñas.

Buenas prácticas de automatización:
– Ejecuta el script con una cuenta de servicio que tenga permisos de lectura/escritura sobre el .accdb/.mdb. Evita mapeos de unidades: usa rutas UNC \\Servidor\\Carpeta\\Base.accdb.

Si además integras conexiones ODBC a otros motores (como DB2), no metas el usuario/clave en plano. Tienes varias opciones seguras en PowerShell:

  • Almacenar un PSCredential en el Administrador de Credenciales y leerlo en tiempo de ejecución con Get-StoredCredential (módulos como CredentialManager).
  • Usar Export-Clixml para guardar un PSCredential cifrado con DPAPI vinculado al usuario/host que ejecuta la tarea:
    $cred = Get-Credential  # pide una vez
    $cred | Export-Clixml -Path "C:\\Seguridad\\db2.cred"
    # En el script desatendido
    $cred = Import-Clixml "C:\\Seguridad\\db2.cred"
    
  • Si tu motor soporta Integrated Security (SQL Server, no Access), úsalo para evitar contraseñas en cadena.

Para Access puro, céntrate en permisos de archivo y en evitar ventanas emergentes. No uses WScript.Shell Popup en tareas desatendidas: registra el resultado en el EventLog o escribe un log con Start-Transcript o Out-File.

  ¿Qué sucede con tus archivos y almacenamiento si cancelas Microsoft 365?

OleDbDataAdapter: el puente entre la base y tu DataSet

OleDbDataAdapter es una pieza clave de ADO.NET que actúa como puente entre el origen de datos (Access vía ACE, por ejemplo) y estructuras en memoria como DataSet o DataTable. Puedes cargar datos con Fill y persistir cambios con Update.

Conceptos esenciales del adaptador:
– MissingSchemaAction=AddWithKey hace que se incluyan claves primarias en el esquema cargado. Útil para que el CommandBuilder genere correctamente INSERT/UPDATE/DELETE.

Creación típica de un adaptador con comandos parametrizados (modelo ADO.NET):

// C# (patrón general)
var da = new OleDbDataAdapter("SELECT * FROM Customers", cn);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.InsertCommand = new OleDbCommand("INSERT INTO Customers (CustomerID, CompanyName) VALUES (?, ?)", cn);
da.UpdateCommand = new OleDbCommand("UPDATE Customers SET CustomerID = ?, CompanyName = ? WHERE CustomerID = ?", cn);
da.DeleteCommand = new OleDbCommand("DELETE FROM Customers WHERE CustomerID = ?", cn);
// Parámetros (orden importa con OleDb)

En .NET también existe OleDbCommandBuilder para generar esos comandos automáticamente a partir del SELECT, lo que simplifica mucho CRUD cuando la consulta es directa a una tabla. Ten presente que algunos proveedores OLE DB no devuelven metadatos de clave primaria; en ese caso, tendrás que establecerlas manualmente en DataTable.PrimaryKey.

Entre los métodos del adaptador destacan: Fill(DataSet/DataTable), FillSchema, Update y utilidades de tratamiento por lotes heredadas de DbDataAdapter. Dispara eventos como RowUpdating y RowUpdated, que te permiten interceptar cada operación DML.

ADO, ADO.NET, OLE DB y ODBC: aclarando la selva de nombres

Microsoft ha cambiado nombres y estrategias varias veces, lo que genera confusión. A modo de brújula: ODBC es el estándar universal; OLE DB es tecnología COM de Windows con proveedores para muchas bases; ADO (clásico) se apoya en OLE DB y se usa en VBA/ASP clásico; ADO.NET es la capa .NET moderna con proveedores como System.Data.OleDb o Microsoft.Data.SqlClient.

Para SQL Server, el proveedor OLE DB actual es MSOLEDBSQL (tercera generación, des-deprecado y mantenido). Para Access, el proveedor es ACE. El clásico SQLOLEDB (MDAC) y el SQLNCLI (SNAC) están obsoletos; si ves Provider=SQLNCLI, cámbialo a Provider=MSOLEDBSQL en conexiones a SQL Server modernas.

En .NET, el proveedor recomendado para SQL Server es Microsoft.Data.SqlClient (paquete NuGet). El antiguo System.Data.SqlClient sigue existiendo pero ya no evoluciona. ADO.NET no está obsoleto: lo usan librerías como Dapper o Entity Framework por debajo.

Ejemplo completo: patrón de trabajo con DataSet y ListView (estilo WinForms)

Muchos proyectos clásicos siguen un patrón: abrir conexión con ACE, cargar un DataSet vía OleDbDataAdapter, manipular filas en memoria y reflejar cambios con Update. Este enfoque es válido y funcional hoy para escritorio.

Estructura típica en VB.NET/WinForms (resumen): un módulo con variables compartidas (OleDbConnection, OleDbDataAdapter, DataSet), un método Conectar que crea la conexión con cadena tipo «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=…» o ACE, rellena DataSet y configura MissingSchemaAction=AddWithKey, y un CommandBuilder para autogenerar DML.

Funcionalidades comunes que puedes replicar en tu app:
– Listar tablas con GetOleDbSchemaTable (OleDbSchemaGuid.Tables, restricción «TABLE») para poblar un ComboBox.

Además, es habitual:
– Construir un ListView con columnas desde DataTable.Columns, guardar cada DataRow en ListViewItem.Tag, permitir edición en UI y, al pulsar Guardar, volcar cambios de vuelta al DataSet y llamar a dbDataAdapter.Update(dbDataSet, NombreTabla).

Para altas, crear un DataRow con NewRow, asignar valores por defecto respetando AutoIncrement, añadirlo a Rows y reflejar en el ListView. Para bajas, recuperar el DataRow desde ListViewItem.Tag y hacer Rows.Remove. Todo esto encaja como un guante con OleDbDataAdapter.

PowerShell: de ADO COM a ADO.NET

Puede que encuentres ejemplos antiguos en PowerShell con new-object -comobject ADODB.Connection y ADODB.Recordset. Funcionan, pero en la práctica es más recomendable usar System.Data.OleDb (ADO.NET), que encaja mejor con .NET y con la gestión de recursos moderna de PowerShell.

Un patrón minimalista .NET equivalente al clásico ADO sería:

$dbFile = "C:\\Path\\to\\database.accdb"
$cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbFile;"
$cn = ::new($cs)
$cn.Open()
$cn.Close()

Si esto te lanza el error del proveedor, revisa instalación ACE y arquitectura. Ejecutar PowerShell x86 para probar con ACE x86 suele ser la pista definitiva cuando conviven Office de 32 bits en sistemas x64.

  ¿Por qué no funciona el scroll en Excel y cómo solucionarlo?

Diagnóstico fino: bitness, rutas y UAC

Checklist de problemas reales que causan el error de proveedor o fallos de conexión en producción:
– Bitness: PowerShell x64 vs ACE x86 (y viceversa). Ejecuta la consola adecuada o instala la variante que necesitas.

Más puntos a vigilar:
– Ruta del archivo: comprueba que el path existe y el usuario de la tarea tiene permisos de lectura/escritura (si hay UPDATE/INSERT). Evita rutas relativas en el Programador de tareas: usa rutas absolutas o UNC.

Considera también:
– UAC/Contexto: la prueba manual puede ir bien, pero en el Programador se ejecuta bajo otra cuenta o sin drives mapeados. Ajusta la cuenta de ejecución y usa \servidor\recurso.

Y no te olvides:
– Persist Security Info=False en cadenas de conexión y no mezclar proveedores (no intentes usar MSOLEDBSQL para Access ni ACE para SQL Server).

Fragmentos útiles de PowerShell para validación

Localizar ACE en el Registro (busca ProgID y CLSID):

Get-ChildItem HKCR:\ | Where-Object { $_.Name -like "*ACE.OLEDB*" } | Select-Object -First 10 | ForEach-Object { Get-ItemProperty $_.PSPath }

Comprobar MSOLEDBSQL (SQL Server) en 32/64 bits, versiones 18 y 19, por si tu entorno mezcla ambos proveedores (útil cuando convives con Access y SQL Server):

Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" | \
  Where-Object { $_.Name -like "*MSOLEDBSQL*" } | \
  ForEach-Object { Get-ItemProperty $_.PSPath }

Si necesitas registrar manualmente una DLL (situación poco frecuente pero posible), recuerda: usa regsvr32 de 32 bits para DLL x86 y el de 64 bits para DLL x64. Ejecuta consola elevada.

De A a Z: ejemplo de consulta y guardado con DataAdapter

Un ejemplo de flujo completo con OleDbDataAdapter en PowerShell para cargar datos en memoria, modificarlos y persistirlos (resumen conceptual):

$cs  = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Datos\\MiBase.accdb;"
$cn  = ::new($cs)
$cn.Open()

$select = "SELECT CustomerID, CompanyName FROM Customers"
$cmd = ::new($select, $cn)
$da  = ::new($cmd)
$ds  = New-Object System.Data.DataSet
$null = $da.Fill($ds, "Customers")

# Generador de comandos automático
$cb = New-Object System.Data.OleDb.OleDbCommandBuilder($da)
$da.MissingSchemaAction = ::AddWithKey

# Editar una fila en memoria
$row = $ds.Tables.Rows
$row = "Nombre Actualizado"

# Confirmar cambios en la base
$da.Update($ds, "Customers")
$cn.Close()

Con consultas complejas, considera crear InsertCommand/UpdateCommand/DeleteCommand a mano y usar parámetros en orden, ya que OleDb se basa en posicionales (placeholders ?). Esto evita problemas de mapeo con proveedores que no devuelven todas las claves.

Cuándo usar ODBC, OLE DB o SqlClient

Para Access en PowerShell lo más directo es OLE DB con ACE. Para SQL Server, si trabajas desde .NET, usa Microsoft.Data.SqlClient. Si programas en C/C++ o necesitas un estándar transversal, ODBC es tu aliado (Microsoft ODBC Driver for SQL Server de tercera generación para SQL modernos).

Si tu código heredado utiliza SQLNCLI (Provider=SQLNCLI11) cámbialo a Provider=MSOLEDBSQL. Y si ves SQLOLEDB (MDAC), migra cuanto antes: es legado y no aprovecha mejoras de seguridad o rendimiento.

En VBA/ASP clásico, ADO+OLE DB sigue siendo válido; en .NET, ADO.NET con OleDb o SqlClient es la vía moderna. Cada capa puede apoyarse en la anterior (ADO.NET puede hablar con OLE DB, OLE DB puede hablar con ODBC mediante MSDASQL), lo que ayuda en compatibilidad.

Trabajar con Access desde PowerShell o .NET exige cuadrar arquitectura, instalar el proveedor correcto y construir bien la cadena de conexión. Con estas piezas encajadas, la apertura, lectura y actualización de datos es directa, y puedes escalar a patrones como DataSet/Adapter o a consultas directas con DataReader según tu necesidad.

Tras revisar los errores típicos del proveedor, las comprobaciones en el Registro, las pruebas con UDL, la estructura de ProgID/CLSID y la automatización sin prompts, tienes el mapa completo para conectar con Access usando System.Data.OleDb en PowerShell con garantías, aprovechar OleDbDataAdapter y entender cómo encajan ODBC, OLE DB, ADO y ADO.NET en el ecosistema de Microsoft.

cómo usar Get-ItemProperty para inspeccionar atributos de archivos cifrados.
Artículo relacionado:
Get-ItemProperty para inspeccionar atributos y cifrado de archivos en Windows