Я занимаюсь разработкой небольшого инструмента на C # для преобразования базовой базы данных MDB Он должен работать на сервере Windows.
Для этого я использую Microsoft.Office.Interop.Access.dll
Проблема в том, что когда я хочу запустить приложение:
accessApp = new Microsoft.Office.Interop.Access.Application();
у меня следующая ошибка:
Восстановление фабрики классов было добавлено к ошибке CLSID {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9} из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Я сохранил dll с помощью команды Regasm , но это тоже самое. Я также пытался запустить в x86, x64 и любом процессоре.
заполненный код:
class Program
{
public static Access.Application accessApp { get; set; }
static void Main(string[] args)
{
try
{
accessApp = new Microsoft.Office.Interop.Access.Application();
accessApp.Visible = true;
string sourceFile = @"D:\Biwee\Bases\styzan.mdb";
string desFile = @"D:\Biwee\Bases\database3.accdb";
//CompactAndRepair(sourceFile, accessApp);
accessApp.ConvertAccessProject(sourceFile, desFile, Access.AcFileFormat.acFileFormatAccess2007);
accessApp.Quit();
}
catch(Exception message)
{
var error = message;
Console.WriteLine("Erreur : " + message);
Console.Read();
if(accessApp != null)
accessApp.Quit();
}
Console.Read();
}
public static void CompactAndRepair(string accessFile, Access.Application app)
{
string tempFile = Path.Combine(Path.GetDirectoryName(accessFile),
Path.GetRandomFileName() + Path.GetExtension(accessFile));
app.CompactRepair(accessFile, tempFile, false);
app.Visible = false;
FileInfo temp = new FileInfo(tempFile);
temp.CopyTo(accessFile, true);
temp.Delete();
}
}
Спасибо за вашу помощь.
ОТВЕТ:
решение следующее, необходимо использовать Access Database Engine 2010 (x86 или 64) , который управляет mdb и accdb.
Код выглядит следующим образом:
object[] args = new object[2]
{
(object) SourceDbMDB,
(object) DestDbACCDB
};
object instance = Activator.CreateInstance(Type.GetTypeFromProgID("DAO.DBEngine.120"));
instance.GetType().InvokeMember("CompactDatabase", BindingFlags.InvokeMethod, (Binder)null, instance, args);
Marshal.ReleaseComObject(instance);
Я разработал приложение для запуска конвертации (при первом запуске, как администратор, установите движок при необходимости);
Затем просто введите следующую команду в cmd:
call "ExePath" "MdbPath"
https://github.com/ColvrayC/App.ConvertMdbToAccdb