如何添加预防措施以绕过 Microsoft.ACE.OLEDB.12.0 未注册?

How do I add precautions to get around Microsoft.ACE.OLEDB.12.0 not registered?

当我在家用计算机上使用以下代码时,它对我来说工作正常。但是,我必须在多台不同的机器上使用它。

"Provider = Microsoft.ACE.OLEDB.12.0;"

我在想可以解决这个问题,因为我需要一种更通用的格式,以便它可以在多台机器上运行。

我希望可以有一个变通办法,可能是通过在代码中包含一个替代提供者(如果可能的话)或者一个 catch 或 if 语句来重新运行代码,但如果不能的话则使用替代提供者找到第一个。

将改为Microsoft.Jet.OLEDB.4.0

如果有人能草草一点代码来解决这个问题,这样我的程序就可以考虑到这两个提供商,那会很棒,因为它会使我的项目更加通用。

后台代码(忽略不安全的SQL除非你想修复它):

    OleDbDataReader^ openData(String^ fieldEntity, String^ field, String^ tableName)
    {
        String^ sqlstr = "SELECT * FROM ";
        sqlstr += tableName + " WHERE " + field + " = " + fieldEntity; 
        OleDbConnection^ conn = nullptr;
        conn = gcnew OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" +
            "Data Source =" + "myDatabaseV3.accdb");
        OleDbCommand^ cmd = nullptr;

        //fix this so that it will consider both providers.
        conn->Open();
        cmd = gcnew OleDbCommand(sqlstr, conn);
        OleDbDataReader^ reader = cmd->ExecuteReader(System::Data::CommandBehavior::CloseConnection); 
        return reader;
    }

这个问题我自己解决了。我意识到如果出现异常

,我可以在我的 class 中使用另一个 try catch 语句来更改连接字符串
    conn = gcnew OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0;" +
        "Data Source =" + "myDatabaseV3.mdb");
    pause();
    OleDbCommand^ cmd = nullptr;

    //fix this so that it will come out of the current directiory 
    try {
        conn->Open();
    }
    catch (Exception^ ex)
    {
        conn->ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;" +
            "Data Source =" + "myDatabaseV3.accdb";
        conn->Open();
    }

如果您希望它们的顺序无关紧要,您可以调换它们。此外,如果此解决方案无效,您可以使用嵌套的 try catch 语句。但是,我的代码特别在 class 中有这个 运行 无论如何在代码的另一部分中尝试捕获,所以这对我来说是不必要的。