我的OLEDbException是由什么引起的,IErrorInfo.GetDescription 失败,返回 E_FAIL(0x80004005)。

14

我正在使用 OleDbConnection、OldDbCommand 和 OleDbReader 与 Access 数据库交互。

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

当从access中运行时,查询可以正确地工作。

一些资源表明,错误可能是由于在查询中使用了保留字并需要用括号括起来。我没有使用任何保留字,但已经将所有列名都用括号括起来以排除这个问题。

为了确定问题出在哪里,我已将查询简化为一个简单的

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)。
  • 错误代码:-2147467259
  • 本机错误:-533136361
  • SQL状态码:3000
4个回答

14

当我说查询不包含任何保留字时,显然是错误的。

我使用的查询是从Access数据库中选择的另一个查询。那个查询中有一个保留关键字,导致了问题。

顺便说一下:

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

因为这两种模式使用了略有不同的保留字集合,所以使用保留字的查询可能在一个模式下工作,在另一个模式下失败。

Access 2007保留字和符号

Keith


只是出于好奇,查询中失败的保留关键字是什么? - StayOnTarget
2
太多年前已经记不清了.. 对我来说重要的是发现,根据调用存储查询的方式不同,有不同的保留字。 - Keith Sirmons

9

..并且已经将所有的名称用方括号包含起来,以防止其出错。

不仅列名称需要用方括号包围, 表名也应该是如此。 例如,替换下面这行代码:

SELECT id FROM table1 WHERE id = 5

使用下面的代码

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

5

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

在尝试打开文件之前,执行“File.Exists”可以确保我的代码正确检测到此特定原因导致的“ IErrorInfo.GetDescription failed with E_FAIL”异常。


哈哈,我在这个错误信息上花了好几个小时,但现在它终于能用了,谢谢 :-) - Muflix

0

我的问题是在这个实例中使用了保留字Domain。由于有太多的保留字,很难进行调试。 我的解决方案是在Visual Studio中使用“数据源”,然后构建一个查询,它会自动检测到保留字并在其周围加上[],使其看起来像Orders.[Domain]。您不必在表格周围加上括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接