AdsConnection在第二个连接上抛出EntryPointNotFoundException,但第一次运行

时间:2019-08-29 15:55:36

标签: c# advantage-database-server

我有一段代码可以重复使用,可以帮助我连接到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();执行正确。

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

1 个答案:

答案 0 :(得分:1)

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

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