2
我有.net3.5 C#應用程序。在託管代碼和非託管代碼之間共享數據庫事務
應用程序使用EntityFramework作爲其數據庫接口。
此應用程序調用C++非託管dll,它也使用數據庫。這個DLL更新數據庫。
我希望能夠回滾。我希望這個操作包含主應用程序所做的更改以及dll所做的更改。
我該怎麼做?我可以與dll共享同一個數據庫連接嗎?我可以與dll共享交易嗎?
感謝,
瑪坦
我有.net3.5 C#應用程序。在託管代碼和非託管代碼之間共享數據庫事務
應用程序使用EntityFramework作爲其數據庫接口。
此應用程序調用C++非託管dll,它也使用數據庫。這個DLL更新數據庫。
我希望能夠回滾。我希望這個操作包含主應用程序所做的更改以及dll所做的更改。
我該怎麼做?我可以與dll共享同一個數據庫連接嗎?我可以與dll共享交易嗎?
感謝,
瑪坦
實體框架,你可以提供自己的SqlConnection
實例。然後,您可以使用此實例與之開始交易。這使您可以控制數據庫連接,這是一個開始。
關於非託管代碼,我建議您允許從DLL的入口點進入托管代碼,從而允許它在此SqlConnection
上執行SQL。
由於SqlConnection
類完全由託管代碼編寫,因此無法將實際連接句柄傳遞給非託管代碼,並允許普通非託管函數使用此連接。因爲你有實體框架作爲起點,你將需要SqlConnection
,所以讓DLL發送SQL語句到託管連接可能是唯一的方法。
您確定沒有辦法共享數據庫連接嗎? – Mattan 2010-11-07 07:56:20
是的。問題是託管連接不僅僅是包裝一個非託管的MSSQL連接庫:它是一個完全託管的實現。這意味着沒有「原始非託管句柄」。這意味着你正在使用兩個完全分離的實現:託管和非託管。因此,您必須選擇一個並通過該連接路由所有命令。因爲我無法想象實體框架與非託管版本的包裝一起工作,所以我會嘗試按照答案中所述的其他方式。 – 2010-11-07 07:58:44