Search code examples
c#databaseexceptionusingcomobject

OleDbCommand in Using block: COM object that has been separated from its underlying RCW cannot be used


I got error "System.Runtime.InteropServices.InvalidComObjectException: 'COM object that has been separated from its underlying RCW cannot be used.'" ONLY when i execute OleDbCommand object in using block with parameters

using (OleDbCommand comm = new OleDbCommand())
        {
            comm.Connection = conn;
            comm.CommandType = CommandType.Text;
            string txt = "SELECT* FROM [ListForGroup] WHERE [email] = @email";
            comm.Parameters.Add("@email", OleDbType.VarWChar).Value = userEmail;
            comm.CommandText = txt;
            conn.Open();
            OleDbDataReader reader = comm.ExecuteReader();
            List<ListForGroups> list = returnLists(reader);
            conn.Close();
            cmbSelectList.DataSource = list;
            cmbSelectList.DisplayMember = "listName";
            cmbSelectList.ValueMember = "listForGroupsID";
        }

Does anyone know reason for that. I can resolve it to use OleDbCommand object with CommandText without parameters but i read that's bad idea. And i want to do it in using block to be sure that all reasources will be released.


Solution

  • I resolved this problem

    using (OleDbConnection conn = new OleDbConnection(connString))
        {
            OleDbCommand comm = new OleDbCommand();
            comm.Connection = conn;
            comm.CommandType = CommandType.Text;
            string txt = "SELECT* FROM [ListForGroup] WHERE [email] = @email";
            comm.Parameters.Add("@email", OleDbType.VarWChar).Value = userEmail;
            comm.CommandText = txt;
            conn.Open();
            OleDbDataReader reader = comm.ExecuteReader();
            List<ListForGroups> list = returnLists(reader);
    
            cmbSelectList.DataSource = list;
            cmbSelectList.DisplayMember = "listName";
            cmbSelectList.ValueMember = "listForGroupsID";
        }
    

    I don't know why I didn't create OleDbConnection in brackets next to using. Another when to resolve it is to close connection after using block.