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

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

本文关键字:Microsoft 注册 ACE OLEDB 何添加 添加 预防措施      更新时间:2023-10-16

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

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

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

我希望可以有一个解决方法,也许通过在代码中包含替代提供程序(如果可能的话(或捕获或 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;
}

我自己解决了这个问题。我意识到我可以在我的类中尝试另一个 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语句。但是,我的代码特别是在一个类中具有此功能,并且无论如何运行方式都在代码的另一部分进行尝试捕获,因此对我来说是不必要的。