2017-04-03 70 views
1

我有一段代碼使用DbDataAdapterDataTable填充數據庫表。無法通過VS2015上的反射綁定到事件

DbDataAdapter通過DbProviderFactory.CreateDataAdapter方法創建,其中DbProviderFactoryDevart dotConnect提供。
我們使用Devart的驅動程序Oracle,SqlServer和Postgres。

由於我在我的DataTable中有將近100k行,我需要綁定到RowUpdated事件(用於更新進度條),但不幸在通用接口上未定義,儘管它在所有提到的數據庫驅動程序中都可用。

因此,我通過反射與此代碼綁定它:

Dim eventInfo As System.Reflection.EventInfo = adapter.GetType().GetEvent("RowUpdated") 
eventInfo.AddEventHandler(adapter, [Delegate].CreateDelegate(eventInfo.EventHandlerType, 
          (Sub(s As Object, e As EventArgs) UpdateProgress(s, e)).Method)) 

這個完美工作,如果編譯VS2013,但未能在運行時如果編譯於羅斯林(VS2015),與此異常:

無法綁定到目標方法,因爲它的簽名或安全透明度與代理類型的不兼容

對此有何幫助?

既不使用Devart.Data.PostgreSql.PgSqlRowUpdatedEventHandler(我目前在Postgres上)作爲e工程的類型。

+0

是否與'評估工作作爲Devart.Data.PostgreSql.PgSqlRowUpdatedEventArgs'在處理程序? – djv

+0

@djv ouch!我使用事件處理程序,而不是事件參數!我明天再試! – Teejay

+0

@djv我會在明天嘗試正確的一個,無論如何,我想避免這麼具體,因爲這樣我就不得不測試DbType,然後使用特定事件。 – Teejay

回答

0

this answer開始發表評論@djv,我終於找到了罪魁禍首。

看來,與Roslyn(VS2015)一樣,您需要在綁定事件處理程序之前明確聲明Delegate

例如,在我的情況,我需要寫:

Public Delegate Sub RowUpdatedEventHandler(sender As Object, e As RowUpdatedEventArgs) 

然後:

Dim eventInfo As System.Reflection.EventInfo = adpt.GetType().GetEvent("RowUpdated") 
eventInfo.AddEventHandler(adpt, [Delegate].CreateDelegate(eventInfo.EventHandlerType, 
          DirectCast(AddressOf UpdateProgress, RowUpdatedEventHandler).Method)) 

而且似乎它與lamdas一些問題。例如,這不起作用:

Dim eventInfo As System.Reflection.EventInfo = adpt.GetType().GetEvent("RowUpdated") 
eventInfo.AddEventHandler(adpt, [Delegate].CreateDelegate(eventInfo.EventHandlerType, 
          DirectCast((Sub(s As Object, e As RowUpdatedEventArgs) UpdateProgress(s, e)), RowUpdatedEventHandler).Method)) 

(帶或不帶DirectCast的lambda表達式)