检查是否安装了用于MS Access的OleDb 12.0驱动程序

时间:2018-04-03 19:47:39

标签: c# .net winforms

我有一个C#应用程序,它使用OleDb 12.0驱动程序连接到MS Access数据库。如果未安装OleDb 12.0驱动程序,则应用程序将抛出一个无法解释的异常。

public static class Program
{
    private static Mutex mutex = null;
    [STAThread]
    static void Main()
    {
        try
        {
            InMemoryValues.CorrectnessRepetition = 15;
            InMemoryValues.MultipleChoiceCount = 6;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }

        ... ...
        ... ...

        Application.EnableVisualStyles();  
        Application.SetCompatibleTextRenderingDefault(false);  
        Application.Run(new CollectionForm());  
    }  
}

我想让用户知道没有驱动程序的具体问题。我不想对信息进行硬编码。

我该怎么做?

相关源代码

public static class InMemoryValues
{
    private static ApplicationData _appData = null;
    public static int CorrectnessRepetition { get; set; }
    public static int MultipleChoiceCount { get; set; }

    static InMemoryValues()
    {
        _appData = ApplicationDataBLLL.Get();

        if (_appData == null)
        {
            _appData = new ApplicationData();
        }
    }

    public static ApplicationData ApplicationData
    {
        set 
        {
            _appData = value;
        }
        get 
        {

            return _appData;
        }
    }

    public static void Save()
    {
        ApplicationDataBLLL.Save(_appData);
    }
}

1 个答案:

答案 0 :(得分:0)

使用OleDbEnumerator.GetElements(),您可以获得DataTable,其中包含所有可见OLE DB提供程序的列表。 返回数据表的第一列是SOURCES_NAME,它是本机OLEDB数据源或枚举器的不变名称。

因此,您可以使用以下代码查明是否已安装Microsoft.ACE.OLEDB.12.0并且对执行进程可见:

var oledb12Installed = new System.Data.OleDb.OleDbEnumerator()
    .GetElements().AsEnumerable()
    .Any(x => x.Field<string>("SOURCES_NAME") ==
        "Microsoft.ACE.OLEDB.12.0");

请注意,如果您在安装Microsoft.ACE.OLEDB.12.0的X64版本时编译X86应用程序,则上面的代码将返回false,这意味着您的应用程序无法使用Microsoft.ACE.OLEDB.12.0