OleDbDataAdapter 在使用包含 Join 的语句时抛出 AccessViolationException

OleDbDataAdapter throwing AccessViolationException when using statment including a Join

我有一段旧代码一直运行到上周。它使用 OleDb 助手 class 来查询 MS Access 数据库。我已经能够查明特定查询的错误。经过一些实验后,我可以确认当语句包含 JOIN 子句时,OleDataAdapter.Fill([DataSet]) 行会抛出 AccessViolationException。我已成功 运行 从 Access 文件中进行完全相同的查询。以及通过助手 class 进行的其他更简单的查询。

什么可能导致此异常?我的研究没有为我提供任何见解,它似乎是一个通用的,"Something went wrong" 堆栈跟踪显示它起源如此之深以至于无法到达

StackTrace: 
at System.Data.Common.UnsafeNativeMethods.ICommandText.Execute(IntPtrpUnkOuter, Guid& riid, tagDBPARAMS pDBParams, IntPtr& pcRowsAffected,Object& ppRowset)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at OleDatabase.hGetDS(String strSQL) in OleDatabase.cs:line 78
at GunTester.ServiceTest.getSalesOrder(String value) in ServiceTest.cs:line 53
at GunTester.ServiceTest.Manual() in ServiceTest.cs:line 29

GunTester 是我的测试 class,OleDatabase 是助手 class。

我怀疑某种环境变化,但据这里的任何人所知,托管此代码的服务器在出现错误之前的几天内都没有被触及。代码同样没有被编辑。 运行使用此代码的服务每天被调用数十次。

编辑:

这是一个精简的代码块,删除了助手 class 和所有其他层。查询包含单个内部联接。我也看到它发生在左连接中,但在审查时该查询将其作为子查询包含在内。如前所述,连接字符串指向 MS Access 数据库,错误由 da.Fill(A)

抛出
public void MinimumTest()
{
        string joinCommand = "SELECT CI_I.ItemCode, IM_I.BinLocation FROM CI_Item CI_I INNER JOIN IM_ItemWarehouse IM_I ON (CI_I.DefaultWarehouseCode = IM_I.WarehouseCode) AND(CI_I.ItemCode = IM_I.ItemCode)";

        OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["RTMAS90"].ConnectionString);
        OleDbDataAdapter da = new OleDbDataAdapter(joinCommand, conn);

        DataSet A = new DataSet();
        da.Fill(A);

        Assert.AreEqual(1, A.Tables.Count);
}

剧情转折: 我用虚拟数据创建了一些新的简单表格

Table A     Table B
ID | This   ID | That
 1 | A       1 | A
 2 | C       2 | B 
 3 | E       3 | C

并在上述测试方法中使用了新查询

SELECT this,that FROM A INNER JOIN B ON A.id = b.id

这没有引发错误。这些新表与第一个失败示例中使用的表之间的区别在于它们的原始表是从 MAS 200.

链接的

在 MS Access 中,我使用链接 Table 管理器刷新查询中的链接表,这解决了问题。