【问题标题】:AdsConnection throws EntryPointNotFoundException on second connection but works the first timeAdsConnection 在第二个连接上抛出 EntryPointNotFoundException 但第一次工作
【发布时间】:2019-08-29 15:55:36
【问题描述】:

我有一段可以重复使用的代码,它可以帮助我连接到 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;
}

此代码在我第一次运行时完美运行,但第二次使用不同的表名调用它时会出现以下异常。

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

我想要一个解释。

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

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

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

【问题讨论】:

    标签: c# advantage-database-server


    【解决方案1】:

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

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

    【讨论】:

    • 你很有可能是对的。我要仔细检查一下,但我之前确实遇到过 ace32.dll 的问题。谢谢
    猜你喜欢
    • 2014-02-06
    • 2016-06-09
    • 2023-01-18
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多