C# OleDb操作Access出现0x80004002接口问题
软源LOGO
讲述咱程序员自己的故事

位置:软源 »编程 »文章

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

coolapp;2015-08-24 11:32:32;浏览:1449

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 之外。

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

分享到:
(转载→)