[CODING]子執行緒存取 Access 資料庫連線不穩定

May 3, 2018




狀況 ISSUE

目前在 Winbase 的開發環境中,存取 Access 資料庫 ( .access ) 時,發現若是反覆進行連線資料庫 ( OleDbConnection ) 時,會不定時發生 AccessViolationException 例外,如下圖,這是作業系統層級的嚴動例狀況,因為侵犯到了其他行程的記憶體,所以程式必須強制關閉

例外

方案 SOLUTION

採用 OleDbDataReader 存取資料庫,如果需要 DataTable 則可以將 DataReader 取得的資料轉至 DataTable ,可以參考下列程式碼。

    var dataset = new DataSet();
    var datatable = new DataTable();
    var sql = "select * from Table";
    OleDbCommand com = null;
    OleDbDataReader reader = null;
    OleDbConnection cn = new OleDbConnection();
    cn.ConnectionString = "Provider = Microsoft.ACE.OLEDB.16.0: Data Source = [Access File Path]; Jet OLEDB:Database Password = ;OLE DB Services=-2;";

    cn.Open();
    com = new OleDbCommand(sql, cn);
    reader = com.ExecuteReader();
    datatable.Load(reader);
    reader.Close();
    com.Dispose();
    com = null;
    dataset.Tables.Add(datatable);

後記 Notes

其實只要透過主執行緒就不會最前面提到的情況,但是在 Winbase 的系統中,若是採用主執行緒處理,則前端的使用者介面就會整個被涷住,無法與使用者做互動,例如視窗的縮小操作都沒有反應,若是缺少適當的提示,很容易讓使用者認為系統當掉了,但其實正在努力的處理使用者的要求。

延伸視窗凍結的情況,則系統無法提供非同步處理,例如在使用者輸入時,同時進行預先檢查或提供選項,都會因為視窗凍結而無法提供。

此外,其實並未找到相關文件說明,在狀況發生的確切原因,而所提供的解決方案則是試誤法下,反覆測試後,相對穩定的撰寫方式,不代表為最佳解,及無法保證必然能解決。

參考 REFREENCE