2017-08-15 85 views
1

我有一段直到上週一直工作的代碼。它使用OleDb輔助類來查詢MS Access數據庫。我已經能夠指出錯誤的具體查詢。經過一些實驗後,我可以確認,當語句包含一個JOIN子句時,OleDataAdapter.Fill([DataSet])行會拋出一個AccessViolationException異常。我已經成功地從Access文件運行相同的確切查詢。以及通過輔助類的其他更簡單的查詢。OleDbDataAdapter拋出AccessViolationException當使用包括一個加入的陳述

什麼可能會導致此異常?我的研究還沒有給我提供任何見解,這似乎是一個通用的,「出事了」堆棧跟蹤顯示它源自深到不可達

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是我的測試類,OleDatabase是助手類。

我懷疑某種環境發生了變化,但據此人所知,託管此代碼的服務器在出現錯誤之前幾天內未觸及。該代碼同樣沒有被編輯過。運行此代碼的服務每天稱爲幾十次。

編輯:

這裏是一個代碼條紋向下塊,除去輔助類和所有其它層。該查詢包含一個內部聯接。我也看到它與左連接發生,但在審查該查詢包括這是一個子查詢。如所提到的,連接字符串指向一個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); 
} 

PLOT TWIST: 我創建了一些新的簡單的表格用啞數據

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鏈接。

+0

你能想出一個[mcve]嗎?它只有一個JOIN會失敗還是必須是一系列複雜的連接?內部連接和外部連接似乎對其有任何影響? –

+0

@GordThompson:它在單個內部連接上失敗,並且在選擇中使用保存的查詢。內/外不起作用。 –

回答

0

在MS Access中,我使用鏈接表管理器來刷新查詢中的鏈接表,這解決了這個問題。