none
VB6程式碼升級VB.NET,無法繼續使用RDO? RRS feed

  • 問題

  • 原先的開發環境是VB6,公司最近在評估升級開發環境到.NET

    但是現有的程式裡面使用大量的RDO元件。

    不曉得有沒有辦法在升級到.NET之後仍能繼續使用RDO元件呢??

    我有先拿支小程式跑升級精靈測試,升級完後會多出一個模組UpgradeSupport.vb,程式碼如下

    Module UpgradeSupport
     Friend RDOrdoEngine_definst As New RDO.rdoEngine
    End Module

    另外產生一個interop.RDO.dll

    同時在原本主程式內的RDO.rdoEngine呼叫被改成RDOrdoEngine_definst,程式碼如下

        Dim strAttribs As String
        Dim rdoConn As New RDO.rdoConnection
        Dim rdoResult As RDO.rdoResultset
        Dim strSQL As String
        Dim sServerName As String
        Dim sDataBaseName As String
        Dim gsDefaultPortNo As String
    
        sServerName = "MySvr"
        sDataBaseName = "MyDB"
        gsDefaultPortNo = "1433"
    
        strAttribs = "Description=" + "SQL Server on server SEQUEL" + Chr(13) + _
           "SERVER=" + sServerName + Chr(13) + _
           "Address=" + sServerName + "," + Trim(gsDefaultPortNo) + Chr(13) + _
           "Network=DBMSSOCN" + Chr(13) + _
           "Database=" + sDataBaseName + Chr(13) + "USEPROCFORPREPARE=OFF"
    
        RDOrdoEngine_definst.rdoRegisterDataSource("MyDB", "SQL Server", True, strAttribs)
        Dim rdoEnv As RDO.rdoEnvironment
    
    
        rdoEnv = RDOrdoEngine_definst.rdoEnvironments(0)
    
    
        'Dim rdoEnv As rdoEnvironment
        'rdoEnv = RDOrdoEngine_definst.rdoEnvironments(0)
        rdoEnv.CursorDriver = RDO.CursorDriverConstants.rdUseServer
    
        Dim strConnect As String
        strConnect = "Uid=" & "uid" & ";" & "Pwd=" & "pwd"
        rdoConn = rdoEnv.OpenConnection("MyDB", RDO.PromptConstants.rdDriverNoPrompt, False, strConnect)
        strSQL = "Select * from Profile1 where chUserID='A123456789'"
        rdoResult = rdoConn.OpenResultset(strSQL, RDO.ResultsetTypeConstants.rdOpenKeyset, RDO.LockTypeConstants.rdConcurValues, RDO.OptionConstants.rdExecDirect)
    

    升級完後的程式在開發環境下RUN正常,但是發佈到使用者環境就出現例外錯誤,訊息如下

    'fome1.UpgradeSupport'的型別初始設定式發生例外狀況,詳細訊息摘路如下

    ************** 例外狀況文字 **************
    System.Runtime.InteropServices.COMException (0x80040112): 由於發生下列錯誤,從 IClassFactory 建立 COM 元件 (CLSID 為 {9A8831F1-A263-11D1-8DCF-00A0C90FFFC2}) 的執行個體失敗: 80040112。

     

    查MSDN發現,COM元件在.NET環境下是透過平台叫用的機制來使用。

    同時用VS2008的ildasm.exe查interop.RDO.dll,發現rdoEngine變成一個介面

    這個訊息是否代表我要在升級完的程式中重新實做RDO.rdoEngine的初始化方法呢??

    又或是有轉散發套件要安裝?

    檢查專案的參考,有列入RDO。專案編譯的目標Framework是2.0

    專案是使用ClickOnce機制發佈,必要條件包含.NET2.0

    測試的開發環境有安裝VB6及VS2008 Team,.NET Framework安裝到3.5 SP1

    用戶環境安裝.NET Framework 1.0、2.0、3.0、3.5、3.5 SP1

     

    懇請 先進大德 不吝撥冗指點

    感激不盡~

    2010年4月22日 下午 03:48

解答

所有回覆

  • 對方的電腦有 RDO 這個元件嗎?
    以下為簽名檔,請勿對號入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年4月22日 下午 04:00
    版主
  • 您好~感謝您的回答

    方便請教RDO有可散發套件好下載嗎?

    曾在微軟下載中心搜尋,沒有找到相關元件

    補充,用戶端及開發環境都是XP SP3

    曾嘗試在用戶端安裝MDAC 2.8 SP1,但系統不支援

    感謝!

     

    2010年4月22日 下午 04:27
  • 建議改寫成ADO.NET, 因為從.NET程式呼叫RDO, 已經犠牲掉Data Binding功能了, 又要蒙受跨平台呼叫/資料轉換引起的效能負擔, 乾脆直接升級成ADO.NET可能還好一點
    2010年4月23日 上午 07:34
  • interop.RDO.dll 必須一起散布,而且會綁版本。

    建議你用 CreateObject 去試看看。我用 ADOX 是正常的。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年4月23日 下午 12:45
  • 感謝您的回覆~

    既然要升級到.NET,改用ADO.NET也是理所當然的

    無奈現行系統的資料存取全部都是RDO,而且系統相當龐大

    所以還是希望能先使用RDO,再逐步升級上去....

    其實敝人內心強烈的願望是很想改用ADO.NET的...

    2010年4月23日 下午 05:12
  • 您好~~

    interop.RDO.dll有隨著專案一起發布到local端,並與執行檔放在一起

    另外也嘗試過以下的寫法

    Import RDO
    
        Dim rdoEnv As RDO.rdoEnvironment
        Dim rdoEng As New RDO.rdoEngine
        rdoEnv = rdoEng.rdoEnvironments(0)
    

    不曉得這是不是您說的CreateObject

    在呼叫New RDO.rdoEngine時出現相同的例外狀況

    懇請 再撥冗指點

    感激不盡!

    2010年4月23日 下午 05:20
  • 找到原因了~

    原來是在使用者環境沒有VB控制項的licenses....

    非常感謝樓上諸位大師的指導~~

    2010年4月24日 下午 04:39
  • RDO 是屬於系統內建的 COM 物件,並不需要 VB 控制項的授權,或許你用了 VB6 的控制項?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年4月26日 下午 02:20
  • 測試程式裡面有一個button 但是把rdo相關呼叫拿掉之後程式是可以執行的

    唯讀在執行到dim rdotest as new rdoEngine這一行 會出現例外~

    補充,RDO物件是在VB6環境裡面就叫進來的~

    2010年4月26日 下午 03:22
  • ms-help://MS.MSDNQTR.v90.cht/dv_vbvers/html/d29275ba-7864-45a9-b994-39f9b9c71cb3.htm

    Visual Basic 6.0 使用者可用的 RDO 資料控制項

    更新:2007 年 11 月

    Visual Basic 6.0 的 遠端資料物件 (RDO) 資料控制項在 Visual Basic 2008 中沒有直接的對等用法。

    概念上的差異

    Visual Basic 6.0 RDO 資料控制項可做為一項機制,將控制項繫結至使用遠端資料物件 (RDO) 的資料庫。在 Visual Basic 2008 中,資料繫結架構已變更,而不再支援 RDO。如需詳細資訊,請參閱 Visual Basic 6.0 使用者可用的資料存取

    升級注意事項

    當 Visual Basic 6.0 應用程式升級為 Visual Basic 2008 時,RDO 資料控制項的執行個體不會隨著升級,並且會發出升級錯誤訊息。您必須在升級前將 Visual Basic 6.0 應用程式修改為使用 ADO (ActiveX Data Objects),或將已升級應用程式中的任何資料繫結程式碼修改為使用新的資料架構。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年4月26日 下午 04:17
  • 您好

    我也了解.NET不支援RDO((就個人的理解,應該僅是RDO的資料繫結功能不支援))

    無奈現實的考量,把整套系統的資料存取改寫為ADO.NET是很大的工程((整間公司的AP))

    加上有時間的壓力,希望能在最短的時間內完成升級,日後再把逐項把每個子系統升級到真正的.net

    其實在上論壇發問前,敝人也翻過MSDN,一度以為是VS2008產生的interop.RDO.dll這個檔案有問題

    另外自己照interop機制去寫,呼叫msrdo20.dll,一樣不成功~

     

    會發問請教,是因為在升級之後,RDO仍然可以RUN,即使是透過interop機制

    而不解的是,為什麼發布到正式環境後無法運作((現在已經了解是license的問題))

     

    還是非常感謝您提供的資訊,日後希望還有跟您請教的機會~~

    非常感激~

    2010年4月26日 下午 05:23