Не могу получить доступ к файлам Microsoft Access (.accdb) с помощью ACE OLEDB, но могу получить доступ к файлам (.mdb) с помощью JET OLEDB
Я пишу исполняемый файл C# и мне нужно проверить, правильно ли указан пароль для базы данных Microsoft Access. Это должно быть в состоянии сделать это как для файлов.mdb, так и для файлов.accdb. Для.mdb я использую JET OLED, и он работает нормально, но JET OLEDB не поддерживает более новые версии Microsoft Access, поэтому я использую ACE OLEDB, но каждый раз получаю сообщение об ошибке. Вот соответствующий метод:
public int CheckPassword(string password, string filePath)
{
// Ensure the correct provider for with .mdb(default) or .accdb
string providerName = "Microsoft.Jet.OLEDB.4.0";
if (Path.GetExtension(filePath) == ".accdb")
{
Console.WriteLine("Changed provider to ACE");
providerName = "Microsoft.ACE.OLEDB.12.0";
}
// Establish access to the file
var accessBuilder = new OleDbConnectionStringBuilder
{
Provider = providerName,
DataSource = filePath
};
accessBuilder["Jet OLEDB:Database Password"] = password;
// Attempt to enter a password and catch if it is incorrect
using (var conn = new OleDbConnection(accessBuilder.ConnectionString))
{
if (ConnectionState.Open != conn.State)
{
try
{
// If it fails here, likely due to an actual bad password.
conn.Open();
Console.WriteLine("0 - Success: Password Correct");
}
catch (OleDbException)
{
// Assumed bad password
Console.WriteLine("2 - Error: Password Incorrect");
return -1;
}
}
}
return 0;
}
Когда я даю ему.accdb, вывод:
Changed provider to ACE
Unhandled Exception: System.Data.OleDb.OleDbException: Cannot open database
''. It may not be a database that your application recognizes, or the file
may be corrupt`.
Когда я даю ему.mdb, вывод:
0 - Success: Password Correct
Я попытался использовать совершенно новый файл Access, но он все равно выдает ту же ошибку
1 ответ
При использовании Ace вам необходимо добавить ссылку на библиотеку Microsoft ActiveX Data Objects 6.1 и, возможно, Microsoft ActiveX Data Objects Recordset 6.0 Library.
Я знаю, что эта ветка относительно старая, но я нашел решение этой проблемы и опубликую другие подобные ответы для справки.