C# OleDb操作Access出现0x80004002接口问题

2015-08-24  金城  2317

C# System.Data.OleDb 操作Access数据库时出现如下错误。

“System.InvalidCastException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理

其他信息:无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“IRowset”。此操作失败的原因是对 IID 为“{0C733A7C-2A1C-11CE-ADE5-00AA0044773D}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败:不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。

同一个数据库,同一个项目中另一个窗体中却不发生这个错误。网上搜了一下,问题和很广泛,有MSSQL,EXCEL等,原因都不清楚,解决方法模模糊糊,好多要重装。也没有跟帖报告是否解决。

(第二天)

最后终于搜到一个解决案例提到多线程中会出现这个问题,于是解决了一下,问题消失。

有问题的代码:

OleDbDataReader rs = cmd.ExecuteReader();

while (rs.Read()){
 cbGroup.Invoke(new Action(() =>{
  ulong gid = DbHelper.F.to_ulong(rs["id"]);
  MissionGroup item = new MissionGroup(gid,DbHelper.F.to_string(rs["title"]));
  cbGroup.Items.Add(item);
  if (this.GroupID == gid){
   cbGroup.SelectedItem = item;
  }
 }));
}
rs.Close();cmd.Dispose();

修改好的代码:

OleDbDataReader rs = cmd.ExecuteReader();

while (rs.Read()){
 ulong gid = DbHelper.F.to_ulong(rs["id"]);
 string til = DbHelper.F.to_string(rs["title"]);
 cbGroup.Invoke(new Action(() =>{
  MissionGroup item = new MissionGroup(gid,til);
  cbGroup.Items.Add(item);
  if (this.GroupID == gid){
   cbGroup.SelectedItem = item;
  }
 }));
}
rs.Close();cmd.Dispose();

也就是把 OleDbDataReader 的操作放到 Controls.Invoke 之外。

所有技术问题解决的过程都是非常耗时的过程,以前不重视个价值,白给别人熬夜了。现在分享出来,是给技术人员查阅的,而不是便宜那些不懂技术常常贬低技术的其他人员。技术人员满脑子都是专业技术,常常不善于做非技术的上沟通,这是技术人员的短板,以后要加强沟通,做到我的技术我做主。