2013-03-19 120 views
0

我有興趣將一套軟件從ODAC v5升級到v8.2.8。DBAccess.pas中的聲明失敗

一個應用程序特別是造成問題。此應用程序加載作爲dll實現的一組輔助應用程序之一。

LibHandle := LoadLibrary(PChar(dllname)); 
if LibHandle <> 0 then 
begin 
    @showForm := GetProcAddress(LibHandle,'ShowMainDllForm'); 
    if (@showForm <> nil) then 
    begin 
    try 
     ShowForm(Application.Handle, @FGlobalVars, 1); 

的發射是好的 - 它有它自己的數據庫連接,我可以通過各種ODAC單位相當愉快步驟。

但是,dll立即嘗試打開遊標時除外。錯誤是單元DBAccess.pas中的斷言失敗,從MemDs.pas調用。我已經完成了這一步,並表明斷言失敗是正確的; Assert(FieldDesc is TCRFieldDesc)正在從MemDS.CreateFieldDefs()收到TFieldDesc

我很難過。一個調用方法可以正常工作(啓動器應用程序)和另一個(dll)總是失敗?

如果有人經歷了這方面我希望任何信息的困難,但是脆弱的它聽起來

+0

您提供的代碼演示庫和調用加載的方法,而不是執行導致錯誤的代碼。請提供用於創建庫中使用的數據庫對象的主應用程序,庫和腳本的完整代碼 - 我們將嘗試重現並修復該問題。 – Devart 2013-03-19 15:07:33

+0

這聽起來比它更容易,主要是因爲有一大堆我必須複製的組件依賴關係。你對我的另一個問題的回答是提供信息......我會盡快回復你。 – 2013-03-19 16:48:34

+0

@devart - 我已經證明,取消斷言線路可以解決問題。我懷疑'AssignConnect'方法中的typeinfo正在丟失。你能評論嗎?弄亂你的代碼對我們來說並不理想,有什麼你能想到的,已經從你認爲可能相關的版本5改變了嗎? – 2013-03-20 15:53:28

回答

1

我們已經解決了這個問題。您可以下載最新版本的ODAC或8.6.12修改行中調用斷言:

在TCustomDADataSet.GetFieldType方法

replace 
    Assert(FieldDesc is TCRFieldDesc); 
with 
    Assert(IsClass(FieldDesc, TCRFieldDesc)); 
+0

太棒了!我們正在提高採購訂單進行升級,但現在我們會看到我們。非常感謝。 – 2013-03-21 09:59:23

+0

我剛剛和我的同事說過,他告訴我他試圖下載8.6在我們的授權期結束之前。他無法找到任何方式來下載除你之外的任何試用版本。你能幫助我們嗎?正如我之前所說,我們正在更新,但這似乎需要時間。 – 2013-03-21 10:42:59

+0

如果您的訂閱已過期,則應該續訂以獲取最新版本。您可以在我們的網站devart.com/odac/ordering.html訂閱續訂部分的續訂和升級選項卡中更新您的訂閱。您可以從我們的網站下載試用版:devart.com/odac/download.html。附:此問題在版本8.5.10中修復。如果此版本可在註冊用戶區使用,您可以使用它來解決問題 – Devart 2013-03-21 14:45:19

1

我們使用DEVART MySQL和SQL連接器。我遇到了MySQL(MyDAC)連接的確切問題。但是,我發現的是: 在DBAccess.pas文件中,上面的代碼更改已經存在;

斷言(IsClass(FieldDesc,TCRFieldDesc));

但我仍然得到相同的斷言錯誤。我在一個小的力度進一步加大,並在CRFunctions單位發現,我做了如下改變,現在我的服務器連接從一個DLL文件完美的作品:

begin 
    if IsLibrary then 
    Result := IsClassByName(Obj, AClass) 
    else 
    //------------------------------------ 
    // Danny MacNevin : October 3,2013 
    // commented out the below line to fix an Assertion Error 
    // using the TMyConnection in a dll file. 
    // It was being called from the DBAccess.pas file at line: 7251 
    // To put this file back to normal, remove the line I added, and 
    // uncomment the line below... 
    //------------------------------------ 
    //Result := Obj is AClass; 
    Result := IsClassByName(Obj, AClass) //Line replaced by Danny 
end;