C#开发Access库存跟踪器执行插入时报COM对象与RCW分离错误
你遇到的COM object that has been separated from its underlying RCW cannot be used报错核心是复用了全局静态的OleDbCommand、OleDbConnection实例导致的。OleDb访问Access的底层依赖COM组件,全局实例在多次操作、资源释放后,容易出现托管RCW(运行时可调用包装)和底层COM对象解绑的情况,执行Command时就会抛出该错误。
解决步骤
- 废弃全局复用的
Access_DB.cmd和长连接,每次数据库操作都新建独立的OleDbConnection、OleDbCommand实例,配合using语句自动释放资源,不需要手动调用Open/Close方法。 - 修正参数赋值的笔误:你代码里给
@bc参数赋值时路径多了一个空格,和后续条码保存路径不一致,会导致后续读取条码文件失败。 - 所有数据库操作的逻辑都放在using块内,确保操作完成后COM资源自动释放,不会残留旧引用。
修正后参考代码
string Uniq = GetUniqueID(UniqueIDInput.Text, 0); string barcodePath = $"./Barcodes/BC_{Uniq}.png"; // 生成条码逻辑保留 var MyBarCode = IronBarCode.BarcodeWriter.CreateBarcode(Uniq, BarcodeEncoding.Code128); MyBarCode.SaveAsImage(barcodePath); // 替换为你Access_DB类中存储的数据库连接字符串 string connStr = Access_DB.连接字符串变量; string insertSql = "insert into SupplyStock (ItemName,UID,Stock,InternalRef,AddedBy,DateCreated,Barcode) values(@it,@uid,@stk,@ir,@adb,@dc,@bc);"; try { using (OleDbConnection conn = new OleDbConnection(connStr)) using (OleDbCommand cmd = new OleDbCommand(insertSql, conn)) { cmd.Parameters.Add("@it", OleDbType.VarChar).Value = ItemNameInput.Text; cmd.Parameters.Add("@uid", OleDbType.VarChar).Value = UniqueIDInput.Text; cmd.Parameters.Add("@stk", OleDbType.VarChar).Value = StockNumber.Value; cmd.Parameters.Add("@ir", OleDbType.VarChar).Value = Uniq; cmd.Parameters.Add("@adb", OleDbType.VarChar).Value = Username; cmd.Parameters.Add("@dc", OleDbType.Date).Value = DateTime.Now; cmd.Parameters.Add("@bc", OleDbType.VarChar).Value = barcodePath; conn.Open(); cmd.ExecuteNonQuery(); MessageBox.Show("物料新增成功", "操作成功", MessageBoxButtons.OK); } } catch (Exception er) { MessageBox.Show("数据写入数据库失败 |" + er, "加载错误", MessageBoxButtons.OK); Console.WriteLine(er); }
注:如果你的Access_DB类封装了连接字符串,直接取出使用即可,不要继续使用全局静态Command实例即可彻底规避该报错。
内容的提问来源于stack exchange,提问作者Bimbles.04
相关产品推荐
相关产品推荐

