2011-03-16 11 views
9

Cómo determinar (para una máquina que ejecuta Windows XP/Vista/7) si ACE o JET está instalado, entonces puedo usar una cadena de conexión apropiada para conectarme a una base de datos de acceso.¿Cómo se determina si ACE o JET en una máquina con Windows usa .net?

+1

Jet siempre está instalado. La pregunta es realmente solo si ACE está instalado o no. –

+1

Creo que la etiqueta "ACE" no es apropiada aquí, porque la mayoría de los desarrolladores, incluido yo mismo, pensamos en Adaptive Communication Environment (http://www.cse.wustl.edu/~schmidt/ACE.html) cuando ven "ACE", que no tiene nada que ver con tu pregunta. –

+0

@Alexei: etiqueta eliminada – willem

Respuesta

7

Hay una clave de registro que puede verificar. Está en HKCR\Microsoft.ACE.OLEDB.12.0. Puedes leerlo usando la clase RegistryKey.

2

Tenga en cuenta que RegistryKey puede estar allí, pero la conexión OleDb aún puede fallar debido a problemas de 32 bits/64 bits. Si la máquina de destino tiene 32 bits ACE.OLEDB instalados, asegúrese de que la aplicación esté compilada para apuntar a la CPU de 32 bits. De lo contrario, la aplicación se puede ejecutar en 64 bits (en un sistema operativo de 64 bits) y luego no puede cargar la versión instalada de 32 bits de ACE.OLEDB.

+1

¿Cómo puede verificar qué arquitectura (si la hay) del proveedor está instalada? –

5

De acuerdo, el Registro no es el mejor método (versiones de 32 y 64 bits, permisos de usuario, etc.). Sin embargo, la pregunta original indicaba "utilizar una cadena de conexión adecuada": este es un problema de tiempo de ejecución, no un problema de tiempo de compilación. Una solución podría ser usar OleDbEnumerator.

Aquí hay un ejemplo que busca la versión de 32 bits de Microsoft Access (ACE 12.0). para una aplicación x86:

using System.Data; 
using System.Data.OleDb; 

    static bool AceOleDb12Present() 
    { 
     OleDbEnumerator enumerator = new OleDbEnumerator(); 
     DataTable table = enumerator.GetElements(); 
     bool bNameFound = false; 
     bool bCLSIDFound = false; 

     foreach (DataRow row in table.Rows) 
     { 
      foreach (DataColumn col in table.Columns) 
      { 
       if ((col.ColumnName.Contains("SOURCES_NAME")) && (row[col].ToString().Contains("Microsoft.ACE.OLEDB.12.0"))) 
        bNameFound = true; 
       if ((col.ColumnName.Contains("SOURCES_CLSID")) && (row[col].ToString().Contains("{3BE786A0-0366-4F5C-9434-25CF162E475E}"))) 
        bCLSIDFound = true; 
      } 
     } 
     if (bNameFound && bCLSIDFound) 
      return true; 
     else 
      return false; 
    } 
Cuestiones relacionadas