我有一段代码可以重复使用,可以帮助我连接到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();
执行正确。
我可以将所有代码放在此代码中,并且只使用一个我需要保持打开状态的连接。那可以绕开我的问题,但是我想避免这种情况,并了解我在做什么错。
答案 0 :(得分:1)
这很可能是由于从ado.net组件的较新版本加载ace32.dll的较旧版本引起的。 AdsIsConnectionAlive是在DLL的更高版本中引入的-不确定确切的版本可能是6.0或更高版本。
第一次建立连接时,ado.net组件会知道该连接未处于活动状态,因此无需调用IsAlive入口点。第二次,因为已经有相同的连接路径建立了连接,所以它将通过检查连接是否仍然存在来尝试重用它。我认为有一种方法可以禁用连接缓存,但不记得详细信息。更好的解决方案是确保优势DLL与版本匹配。