lelouch_vi 2 Ответов: 1

Как исправить COM-объект, который был отделен от его базового RCW, не может быть использован.


Здравствуйте, мне трудно решить эту проблему, я работаю с vs2017 и получаю доступ к своей базе данных. Я действительно не знаю, что здесь произошло.

У меня есть COMBOBOX, который отображает имя поля all category name из моей базы данных, и оттуда я могу удалить строку в своей базе данных, используя имя, отображаемое в combobox, но я столкнулся с этой ошибкой.

Ниже приведен мой код:


Private Sub cmbCategory_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbCategory.SelectedIndexChanged

Using cons As New OleDb.OleDbConnection(conSTR)
    Dim rdr As OleDb.OleDbDataReader

    With cmd
        .Connection = cons
        .CommandText = "SELECT CategoryName, CatPercent FROM Category WHERE CategoryName = @cn"
        .Parameters.AddWithValue("cn", cmbCategory.Text)
        .Connection.Open()
        rdr = cmd.ExecuteReader

        If rdr.HasRows Then

            While rdr.Read()

                txtCategory.Text = rdr("CategoryName").ToString
                numCategory.Text = rdr("CatPercent")

            End While

            rdr.Close()
            .Connection.Close()

        Else
            MessageBox.Show("NO DATA FOUND", "CATEGORY", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

        End If


    End With


        End Using


    End Sub


Исключение происходит в АФЕРЫ что удерживает мою связь с той, которую я выделил жирным шрифтом и подчеркнул выше. Я не знаю, что это значит.

Это происходит после того, как я выбираю в своем поле со списком имя, а затем удаляю его, а затем снова выбираю и пытаюсь удалить, но эта ошибка всплывает
COM object that has been separated from its underlying RCW cannot be used.


Что я уже пробовал:

Я думал, что это просто моя строка соединения, которая вызывает несколько соединений, но это было не так.

It occurs after I select in my combo box a name and then I delete it and then I select again and try to delete but this error pops up <pre>COM object that has been separated from its underlying RCW cannot be used.

Richard MacCutchan

Почему вы пытаетесь удалить один и тот же элемент более одного раза?

Сообщение об ошибке предполагает, что вы, возможно, пытаетесь получить доступ cons из отдельного потока в вашем приложении.

Richard Deeming

Почему вы используете его повторно? OleDbCommand пример cmd Просто создайте новый экземпляр для каждой команды, которую вы хотите выполнить, и оберните его в Using блок.

rdr также следует завернуть в Using блок.

lelouch_vi 2

Я вижу.Спасибо, что обратили на это внимание. Ошибка действительно исчезла, но не могли бы вы объяснить немного больше о создании экземпляров cmd? Я подумал, что если я объявлю cmd как локальную переменную, то к ней не смогут получить доступ другие функции?

1 Ответов

Рейтинг:
10

Richard Deeming

Я подозреваю, что проблема в том, что вы храните свои OleDbCommand объект в поле уровня класса и повторное использование его в разных методах.

Измените свой код, чтобы создать экземпляр команды, когда он вам понадобится, и оберните его в Using блокируйте, и ваша ошибка почти наверняка исчезнет.

Private Sub cmbCategory_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbCategory.SelectedIndexChanged

    Using cons As New OleDb.OleDbConnection(conSTR)
        Using cmd As New OleDb.OleDbCommand()
            cmd.Connection = cons
            cmd.CommandText = "SELECT CategoryName, CatPercent FROM Category WHERE CategoryName = @cn"
            cmd.Parameters.AddWithValue("cn", cmbCategory.Text)
            
            cons.Open()
            Using rdr As OleDb.OleDbDataReader = cmd.ExecuteReader()
                If rdr.Read() Then
                    txtCategory.Text = rdr("CategoryName").ToString
                    numCategory.Text = rdr("CatPercent")
                Else
                    MessageBox.Show("NO DATA FOUND", "CATEGORY", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                End If
            End Using
        End Using
    End Using
End Sub


Maciej Los

5ed!

lelouch_vi 2

Эй, чувак, спасибо тебе за всех. Я нашел, где ошибка. Я забыл, что объявил cmd в модуле, чтобы каждый класс мог получить к нему доступ, но я думаю, что это ошибка, исходящая от него. Как и то, что вы сказали, У меня может быть несколько экземпляров cmd. В Любом Случае Спасибо!!!