AdsConnection 在第二次连接时抛出 EntryPointNotFoundException 但第一次有效

AdsConnection throws EntryPointNotFoundException on second connection but works the first time

我有一段代码可以重用,它可以帮助我连接到 adt 数据库并读取数据。

using Advantage.Data.Provider;

...

protected DataTable FillTable(string tableName)
{
    DataTable table = new DataTable();

    using (var conn = new AdsConnection(connectionString))
    using (var adapter = new AdsDataAdapter())
    using (var cmd = new AdsCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "select * from " + tableName;
        adapter.SelectCommand = cmd;
        conn.Open();
        adapter.Fill(table);
        conn.Close();
    }

    return table;
}

这段代码在我第一次执行时运行良好,但在我第二次使用不同的 table 名称调用它时出现以下异常。

System.EntryPointNotFoundException: 'Unable to find an entry point named 'AdsIsConnectionAlive' in DLL 'ace32.dll'.'

我想要一个解释。

我已尝试阅读此错误,但我发现的所有可能情况都无法解释为什么它第一次起作用。他们提到 DLL 的问题,例如版本错误或与 .NET 版本不兼容,...

如果我更改调用顺序,代码第二次仍然失败,所以我知道问题不在于 table 的名称或我调用代码的方式。问题可能出在我没有正确关闭连接。我已经尝试添加更多大括号以确保该部分正确运行并且我已经调试以确保第一个 conn.Close(); 被正确执行。

我可以将我所有的代码都放在这段代码中,并且只使用一个连接,只要我需要它就一直打开。那会绕过我的问题,但我想避免这种情况并了解我做错了什么。

这很可能是由于从较新版本的 ado.net 组件加载较旧版本的 ace32.dll 造成的。 AdsIsConnectionAlive 是在更高版本的 DLL 中引入的——不确定确切的版本可能是 6.0 或更高版本。

第一次建立连接时,ado.net 组件知道连接不存在,因此无需调用 IsAlive 入口点。第二次,由于已经有一个连接到相同的连接路径,它会通过检查它是否仍然存在来尝试重用它。我认为有一种方法可以禁用连接缓存,但不记得细节了。更好的解决方案是确保优势 DLL 与版本匹配。