C# OleDb操作Access出现0x80004002接口问题
2015-08-24 金城 2372
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();
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();
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 之外。
所有技术问题解决的过程都是非常耗时的过程,以前不重视个价值,白给别人熬夜了。现在分享出来,是给技术人员查阅的,而不是便宜那些不懂技术常常贬低技术的其他人员。技术人员满脑子都是专业技术,常常不善于做非技术的上沟通,这是技术人员的短板,以后要加强沟通,做到我的技术我做主。
- 上一篇:Unix时间戳转换大全/方法汇总
- 下一篇:让网页自动滚动