如果Ole.DB提供程序在系统上可用,为什么OleDbConnection.Open()抛出无法识别的数据库格式

时间:2019-07-19 12:43:10

标签: c# oledb

我在Windows x64上尝试了下一个代码,但是代码已编译并作为x86运行。如果我在Windows 7或10 x86中运行该应用程序,则会出现相同的行为。

static IList<string> GetOleDbProviders()
{
    OleDbEnumerator oleDbEnumerator = new OleDbEnumerator();
    DataTable oleDbProviders = oleDbEnumerator.GetElements();

    IDictionary<string, string> descriptions = new Dictionary<string, string>();
    int typeColumnIndex = oleDbProviders.Columns.IndexOf("SOURCES_TYPE");
    int nameColumnIndex = oleDbProviders.Columns.IndexOf("SOURCES_NAME");
    int descriptionColumnIndex = oleDbProviders.Columns.IndexOf("SOURCES_DESCRIPTION");

    foreach (DataRow dataRow in oleDbProviders.Rows)
    {
        int type = (int)dataRow[typeColumnIndex];

        if (type == 1)
        {
            string name = (string)dataRow[nameColumnIndex];
            string description = (string)dataRow[descriptionColumnIndex];
            descriptions.Add(name, description);
        }
    }

    IList<string> providers = new List<string>();

    foreach (KeyValuePair<string, string> pair in descriptions)
    {
        providers.Add(pair.Value);
    }

    return providers;
}

static void Test5()
{
    // has item 'Microsoft.Jet.Ole.DB.4.0'
    IList<string> providers = GetOleDbProviders();

    string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\my.accdb";
    System.Data.Common.DbConnection connection = new OleDbConnection(connectionString);

    try
    {
        // throws OleDbException on 32 bit with message 'Unregonized database format'
        connection.Open();
    }
    catch (InvalidOperationException e)
    {
        // break point when running on 64-bit runtime
    }
    catch (OleDbException e)
    {
        // break point when running on 32-bit runtime
    }
}

如果Jet.OleDb由系统提供,为什么connection.Open()会引发异常?或这是否意味着Jet.OleDb支持其他格式,但不支持* .accdb。

当然,在安装Microsoft Access 2013 Runtime之后,它可以工作,但是仍然可以吗?如果不会从oleDbEnumerator.GetElements()返回Microsoft.Jet.Ole.Db.4.0提供程序,并抛出ProviderNotFound异常,会不会更正确?

enter image description here

编辑

安装Microsoft Access 2013 Runtime后,它仍然不起作用。您必须使用更新的 ACE提供程序,而不是Jet。连接字符串必须相应地更新。

1 个答案:

答案 0 :(得分:3)

  

这是否意味着Jet.OleDb支持其他格式,但不支持   * .accdb。

是-旧版驱动程序将支持旧版mdb格式。

根据the docs

  

从Access 2007开始,.accdb是默认的Access文件格式。

     

在Access 2007中引入.accdb文件格式之前,Access   文件格式使用.mdb文件扩展名。

如果您有兴趣,该链接将为您提供有关mdb和accdb之间差异的更多信息。

  

如果Microsoft.Jet.Ole.Db.4.0提供程序不是   从oleDbEnumerator.GetElements()和ProviderNotFound返回   会抛出异常吗?

不,不会。提供程序在此处。它不支持Access数据库的所有版本的事实并不意味着它不存在。如果根本看不到它,人们将无法使用驱动程序来访问mdb文件-例如(破坏了许多旧的VB6应用程序)。