在C ++(VS2010,MFC,Excel / ODBC)中处理CDBException(错误)

初学者在这里。

我有一个使用VS2010编译的MFC Vicual C ++应用程序。 我有一个DSN作为ODBC连接到一个实时Excel电子表格(通过Excel驱动程序)。

我的应用程序每秒查询一个电子表格。 如果一个单元格的值发生了变化(简单计算涉及其他单元格接收实时数据馈送的结果),那么应用程序会打印新值,然后返回查询更改。

该应用程序工作正常的一段时间,忠实地打印新的数据到饲料中的单元格的值的变化。 然后,它总是产生一个错误:

“Microsoft Jet引擎找不到对象”(未知)“请确保该对象存在,并且正确拼写其名称和path名称。

文件path全部以绝对值表示。

我推测,只要查询恰好与正在更新的单元格内容一致,就会产生错误。 我可以通过点击被调查的单元格然后触摸一个键(开始编辑单元格,这里通过对单元格公式的反应)来生成完全相同的错误信息和行为。

Afx错误对话框运行。 如果我“确定”并selectexcel文件,应用程序将返回并运行,直到出现新的相同错误。 但是,如果我select“取消”应用程序退出。

如果我注释掉我自己的错误捕获,这个对话框仍然出现。

我想应用程序运行“无头”,只是重试连接数据库。

有什么办法可以在这里覆盖?

我意识到Excel不适合并发(多用户)访问。 但是我不需要同时访问 – 当“其他”改变它的时候,我不在乎看到这个单元格。 我只是想(等待)重试。

提前在这里询问有关恐龙骨科技的道歉。 事实上,我需要查询实时数据导致了我的试用和错误的ODBC(libxl只能看到文件数据和公式,而不是他们的价值观)。

你应该像这样处理CDBException

  try { // DB calls } catch(CDBException *err) { // simply ignore the error err->Delete(); } 

所以,我终于得到了这个工作。 在执行SQL的函数中,我捕获了被破坏的exception,然后调用“ExitThread()”,而不是简单地允许应用程序继续退出。 调用该函数的线程将终止,但应用程序不会退出。 然后,我把这个调用线程的创build放在一个工作线程中,每工作一个半秒钟,使用WaitForSingleObject()来testing调用线程是否正在运行。 在调用线程中,我还添加了电子表格文件的存在检查,电子表格文件始终存在,但由于Excel不支持并发,可能不会显示在应用程序中。

因此,您可以通过ODBC从Visual C ++查询Excel电子表格,这个应用程序对于意外触摸电子表格中的键或单元更新(这里来自市场数据馈送)导致令人讨厌的“不存在的链接”错误。 这不是特别优雅,但它是快速的,迄今为止,强劲。