簡體   English   中英

如果Ole.DB提供程序在系統上可用,為什么OleDbConnection.Open()會拋出無法識別的數據庫格式

[英]Why OleDbConnection.Open() throws Unrecognized database format if Ole.DB provider is available on the system

我在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異常,那么會更正確嗎?

在此輸入圖像描述

編輯

安裝Microsoft Access 2013 Runtime后,它仍然無法正常工作 您必須使用較新的ACE提供程序而不是Jet。 必須相應地更新連接字符串。

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

是的 - 舊版本的驅動程序將支持舊的mdb格式。

根據文檔

從Access 2007開始,.accdb是默認的Access文件格式。

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

如果您感興趣,該鏈接將為您提供有關mdb和accdb之間差異的更多信息。

如果不從oleDbEnumerator.GetElements()返回Microsoft.Jet.Ole.Db.4.0提供程序並且拋出ProviderNotFound異常,那么會更正確嗎?

不,它不會。 提供者那里。 它不支持所有版本的Access數據庫並不意味着它不存在 如果它根本不可見,人們將無法使用驅動程序訪問mdb文件 - 作為一個例子(破壞了許多舊的VB6應用程序)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM