如何处理“已尝试释放正在使用的RCW。”错误

时间:2019-05-27 01:52:24

标签: vb.net

我知道这个问题可能是重复的问题,但是我有一个问题,需要解决方案来解决。

我已经创建了一个项目,并在所有地方都使用了功能和Sub。

其中一个功能/子就像

Public Sub ExecuteQuery(Xcn As OleDbConnection)
    Try
        If Xcn.State = ConnectionState.Open Then Xcn.Close()
        Xcn.Open()
        cmd.Connection = Xcn
        cmd.ExecuteNonQuery()
        Xcn.Close()
    Catch e As Exception
        Throw e
    End Try
End Sub

我只使用executequery(con)而不是每次都写完整的句子。
现在的问题是,我创建了一个bw_worker并运行一个子程序,其中包括异步显示的小子程序。

例如,A sub是我像这样运行异步,

Private Sub RunCode()
    dim cmd as new oledbcommand("Select * from table",con)
    if con.state = ConnectionState.closed then con.open()
    execute reader stuff here
    if con.state = ConnectionState.Open then con.close()
    ExecuteQuery(con)
    cmd = new Oledbcommand("Select * from Table2",con)
    ExecuteQuery(con)
End Sub

我不知道它的良好做法,但是现在出现了问题。
我试图创建一个加载屏幕,以便花一些时间获取功能和辅助功能,因此我引用了Link并遇到了错误。
注意:,我了解它所带来的错误,但如果可能的话,我想知道一种解决方法。就像无需更改大量代码的可能。

1 个答案:

答案 0 :(得分:1)

如果将数据库对象放在本地,则不会在另一个线程上打开它们。命令也一样。此代码将演示如何使用Using块,即使有错误,该块也将关闭并处置数据库对象。请不要.AddWithValue。 .Add方法强制您命名数据类型,这将有助于直观地提供传入的数据类型匹配的线索。还有一些使用.Add的数据库原因。参见https://www.dbdelta.com/addwithvalue-is-evil/https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

可以在连接字符串中使用类级别的变量,这样您就不必一直输入它。

Private ConnString As String = "Your connection string"

Private Sub RunCode()
    Using con As New OleDbConnection(ConnString)
        Using cmd As New OleDbCommand("Select * from table", con)
            con.Open()
            Using reader = cmd.ExecuteReader
                'reader stuff here
            End Using
        End Using
    End Using
End Sub