0

我写了一个应该在很多机器上运行的程序

我没有在机器上安装 Access 但是我有一个在它们上使用的 access 数据库

当我从这个 Access 数据库写入和删除数据时,它的大小会增加,所以每隔几天我就必须压缩它们并缩小大小

这是我使用的代码

public void Compacting()
{
    try
    {
        Microsoft.Office.Interop.Access.Application application = new Microsoft.Office.Interop.Access.Application();

        string dbName = "";
        try
        {
            dbName = ConfigurationManager.ConnectionStrings["LocalPulserDB"].ConnectionString.Split("Data Source=").Last().Split(";").First();
        }
        catch (Exception ex)
        {
            string localDbError = "DataBase location is incorrect ";
            System.Windows.MessageBox.Show(localDbError);
            Environment.Exit(1);
        }

        CompactAndRepair(dbName, application);
    }
    catch (Exception ex)
    {
        try
        {
            LocalPulserDBManagerInstance.WriteLog(ex.StackTrace, ex.Message);
        }
        catch (Exception)
        {

        }
    }
}

private void CompactAndRepair(string accessFile, Microsoft.Office.Interop.Access.Application app)
{
    string tempFile = Path.Combine(Path.GetDirectoryName(accessFile),
                      Path.GetRandomFileName() + Path.GetExtension(accessFile));

    app.CompactRepair(accessFile, tempFile, true);
    app.Visible = false;

    FileInfo temp = new FileInfo(tempFile);
    temp.CopyTo(accessFile, true);
    temp.Delete();
}

但我得到了下一个错误:

{"Retrieving the COM class factory for component with CLSID {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE))."}

我能做些什么?

4

2 回答 2

1

Interop 要求在运行代码的机器上安装 Office,我怀疑您将无法利用该方法执行压缩和修复。

https://social.msdn.microsoft.com/Forums/en-US/973ce94f-5235-4be9-a2b1-51ba7d35e1f3/installing-office-primary-interop-assemblies-without-actually-installing-office?forum=innovateonoffice

但是,您可以使用此独立工具“Jet compact 实用程序”: https ://docs.microsoft.com/en-us/office/troubleshoot/access/jet-compact-utility-download

于 2020-01-09T19:59:30.357 回答
0

您不需要甚至不想创建一个完整的访问实例来访问只是紧凑的。(或者甚至使用 + 从表中提取数据。

设置对 ACE 数据库引擎的引用。这样您就可以提取 + 使用数据,而不必像 Access 那样自动(创建)一个相当繁重的应用程序对象。如果你确实创建了一个完整的 Access 实例,那么 VBA 代码和启动表单之类的东西就会运行(不仅因为现在你有一个隐藏的 UI 很糟糕 - 而且你无法回答提示,更糟糕的是启动代码可能会已经启动了一个表格,该表格将打开一个表格,然后在所有表格都关闭之前您无法压缩。

在 vb.net 代码中,这将压缩:

    Dim ACEEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine

    Dim strDatabase As String = "c:\test\test44.accdb"

    ' you always compact to a copy - you cannot compact "over" the existing database

    Dim strTempDB As String = "c:\test\temp.accdb"
    Debug.Print("starting compact")
    Try
        ACEEngine.CompactDatabase(strDatabase, strTempDB)
        Debug.Print("compact done")

    Catch ex As Exception
        Debug.Print(Err.Description)
    End Try

请注意:您可以按照上述检查错误代码,因为如果数据库中有任何其他用户,则不会发生压缩。

如果其他人打开了数据库,上面的输出?

starting compact
Exception thrown: 'System.Runtime.InteropServices.COMException' in ACETest.exe
You attempted to open a database that is already opened by user 'Admin' on machine
'ALBERTKALLAL-PC'. Try again when the database is available.

所以,抓住错误。如上所示,您需要一个互操作引用

C:\Program Files (x86)\Microsoft Visual Studio 12.0\
Visual Studio Tools for Office\PIA\Office14\
Microsoft.Office.interop.access.dao.dll

只需检查 err.Number 是否为 0。如果发生压缩,则可以删除或更好地重命名原始数据库,然后将“临时”数据库重命名为原始名称。(来自 Access UI 的压缩 + 修复在幕后执行此操作,实际上在压缩过程中不会覆盖原始文件,因为它可能会失败或不起作用)。您可以在尝试压缩之前尝试检查现有的 .ldb 文件(锁定文件),但压缩过程检查 + 要求您 100% 独占使用该文件,并且如果压缩无法独占使用该文件,然后按照上述吐出一条错误消息。

因此,只需将程序集引用添加到您的项目中。您还应该强制您的 .net 项目使用 x86,而不是将其留给“任何 CPU”。

以上将在没有安装 Access 的情况下工作。但是,您需要安装 JET 或 ACE 数据引擎。JET 引擎默认安装在所有 Windows 副本上 - 但仅适用于 mdb 文件。如果您需要压缩并使用 accDB 文件,那么您将必须安装 ACE 数据库引擎 - 但它的占用空间要小得多,然后安装 Access 或运行时的完整副本(两者的大小和很大。如上所述,您不需要在计算机上安装 Access。

编辑

您可以从此处找到 + 安装 ACE 版本: https ://www.microsoft.com/en-us/download/details.aspx?id=54920

请注意,在上面,您有两个选择。(x32 或 x64 - 所以你必须安装你想要的版本。这也表明你需要两个版本的 .net 代码,或者你可以找到一种快捷方式来启动“任何”cpu 以启动为 x32 或 x64 - 你如何开始如果您要选择“任何 cpu”而不是强制 .net 项目(并提供两个版本的项目,如我在下面的示例链接中所做的那样),您的 .net 项目将确定它是以 x32 还是 x64 运行。

我有一个工作的 .net (tiny) .exe 文件,可以让您以 x32 或 x64 运行,因此您可以快速检查您安装的 ACE 版本。

链接: https ://onedrive.live.com/embed?cid=B18A57CB5F6AF0FA&resid=B18A57CB5F6AF0FA%21101313&authkey=AB-I3mHVZhLmd2Q

于 2020-01-10T23:33:05.200 回答