cdbeexception(错误)处理在c++ (VS2010, MFC, Excel/ODBC)

CDBException (error) handling in C++ (VS2010, MFC, Excel/ODBC)

本文关键字:MFC Excel ODBC c++ 错误 处理 cdbeexception VS2010      更新时间:2023-10-16

初学

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

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

App在一段时间内正常工作,在新数据到达提要时忠实地打印单元格值的变化。然后,它总是生成一个错误:

" Microsoft Jet Engine找不到对象'(unknown)',请确保该对象存在,并正确拼写其名称和路径名。"

文件路径都是绝对给出的。

我推测,每当查询恰好与正在更新的单元格内容一致时,就会生成错误。我可以生成完全相同的错误消息和行为,总是,立即,通过单击调查单元格并触摸一个键(开始编辑单元格,这里通过覆盖单元格公式)。

一个Afx错误对话框运行。如果我"OK"并选择excel文件,应用程序将返回并运行,直到出现新的相同错误。但如果我选择"取消",应用程序将退出。

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

我希望应用程序运行"无头",仅仅重试与数据库连接。

我有办法重写这里吗?

我意识到Excel不适合并发(多用户)访问。但是我不需要并发访问——当"其他东西"正在改变单元格时,我不在乎看到它。我只是想(等待并)重试。

为在这里询问恐龙骨骼技术提前道歉。由于需要查询实时数据,我反复尝试使用ODBC (libxl只能看到文件数据和公式,而不能看到它们的值)。

您应该这样处理CDBException:

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

所以,我终于得到了这个工作。在执行SQL的函数中,我捕获异常,销毁,然后调用"ExitThread()",而不是简单地允许应用程序继续退出。调用该函数的线程将终止,但应用程序没有退出。然后,我将这个调用线程的创建放在一个工作线程中,该线程使用WaitForSingleObject()每半秒测试一次,以查看调用线程是否正在运行。在调用线程中,我还添加了一个电子表格文件是否存在的检查,该文件始终存在,但由于Excel缺乏并发性支持,可能对应用程序不可见。

所以,你可以在一个应用程序中通过ODBC从Visual c++中查询Excel电子表格,这对于那些不小心触摸电子表格中的键或单元格更新(这里,来自市场数据提要)导致讨厌的"不存在的链接"错误的人来说是强大的。它不是特别优雅,但速度很快,而且到目前为止还很健壮。