什么导致我的OLEDbException,IErrorInfo.GetDescription失败了E_FAIL(0x80004005)

时间:2013-03-20 20:41:48

标签: exception ms-access oledbconnection

我对Access数据库使用OleDbConnection,OldDbCommand和OleDbReader。

我在数据库中有一个命名查询,我从代码中调用它。

从访问中运行查询时,查询正常工作。

有几个资源表明错误可能是由于在查询中使用保留字并用括号括起来引起的。我没有使用任何保留字,并且无论如何都将括号中的所有列名包装起来以排除它。

尝试确定问题所在,我已将查询简化为简单的

SELECT id FROM table1 WHERE id = 5 

Ole连接不会抛出异常。

当我介绍查询的下一部分时:

SELECT table1.id FROM table1 INNER JOIN storedQuery ON table1.id = storedQuery.id WHERE table1.id = 5" 

然后我得到了例外。

例外情况如下:

  
      
  • 消息:IErrorInfo.GetDescription因E_FAIL(0x80004005)而失败。
  •   
  • ErrorCode:-2147467259
  •   
  • NativeError:-533136361
  •   
  • SQLState:3000
  •   

3 个答案:

答案 0 :(得分:13)

当我说查询中没有任何保留字时,我显然错了。

我正在使用的查询是从Access数据库中的另一个查询中进行选择。其他查询有一个导致问题的保留关键字。

顺便说一句:

  

Access数据库引擎以不同的模式运行,具体取决于是从Access,数据访问对象,Access数据库引擎的Microsoft OLE提供程序还是Microsoft Access ODBC驱动程序调用它。它可以在ANSI模式或非ANSI(传统)模式下运行。

     

因为使用这两种模式导致两组略有不同的保留字,所以使用保留字的查询可能在一种模式下工作而在另一种模式下失败

     

Access 2007 reserved words and symbols

基思

答案 1 :(得分:8)

  

..并且已将所有<​​strong>列名称包含在括号中,以便将其排除在外。

不仅应该用方括号括起来的列名 表名也应该如此 例如,替换以下行

SELECT id FROM table1 WHERE id = 5

使用以下行

SELECT [id] FROM [table1] WHERE [id] = 5

答案 2 :(得分:2)

此异常的另一个可能原因是,如果您尝试加载/读取的文件不存在。

我发现在尝试打开文件之前执行“File.Exists”非常有用,只是为了确保我的代码正确检测到“IErrorInfo.GetDescription失败并带有E_FAIL”异常的特定原因。