解決ASP呼叫VB.NET撰寫的COM+元件沒有停止的問題

摘要:解決ASP呼叫VB.NET撰寫的COM+元件沒有停止的問題

在新舊系統交替的尷尬期,本來的系統是
ASP-----COM+(VB6)-------DB
會變成
ASP/ASP.NET-----COM+(VB6/VB.NET)-----DB
這樣新舊混用的階段(系統龐大,不太可能全部改寫成.NET再上線)

在這樣的尷尬期裡,上次小喵提到在ASP.NET呼叫VB6/VB.NET所撰寫的元件,他的使用釋放方式是不同的。這次來聊聊用ASP呼叫新的VB.NET撰寫的元件的問題

其實啟動新舊元件的寫法是一模一樣的,最大的問題在於,ASP呼叫VB6的元件,當元件執行完後,會自動的釋放掉,但是用ASP呼叫VB.NET開發的元件,卻會讓元件在執行完成時,沒有完全的回收釋放。如果元件是讀取資料那還沒關係,慘的是如果呼叫的元件是維護資料,由於元件並沒有運轉完成並回收。因此整個維護時的Transaction並沒有釋放掉。這會造成其他的程式讀取資料時,因為還被Lock而一直等待著。

因此如果VB.NET所撰寫的元件必須要讓ASP或者VB6的元件呼叫的時候,就必須捨棄AutoComplete(),額外加入手動的SetComplete與SetAbort的動作,並停用AutoComplete。相關的程式碼請參考以下

Public Function ChgData(Byval Fld1 as String,Byval Key1 as String) As String
    Dim ConnStr as String = "連接字串"
    Using Conn as New SqlConnection(ConnStr)
        Try
    
            Dim SqlTxt as String = "Update Table1 Set Fld1=@Fld1 Where Key1=@Key1 "
            Dim Cmmd as New SqlCommand(SqlTxt,Conn)
            Cmmd.Parameters.AddWithValue("@Fld1",Fld1)
            Cmmd.Parameters.AddWithValue("@Key1",Key1)
            Cmmd.ExecuteNonQuery()

            Return "Success"
            ContextUtil.SetComplete()  '增加這個手動的SetComplete

       Catch ex as Exception
            Return "False"
            ConTextUtil.SetAbort()    '增加這個手動的SetAbort
            Throw New Exception(ex.Message)

       End Try
    End Using
End Function

以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat