如何添加预防措施以绕过 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 中有这个 运行 无论如何在代码的另一部分中尝试捕获,所以这对我来说是不必要的。
当我在家用计算机上使用以下代码时,它对我来说工作正常。但是,我必须在多台不同的机器上使用它。
"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 中有这个 运行 无论如何在代码的另一部分中尝试捕获,所以这对我来说是不必要的。