【问题标题】:CDBException (error) handling in C++ (VS2010, MFC, Excel/ODBC)C++ 中的 CDBException(错误)处理(VS2010、MFC、Excel/ODBC)
【发布时间】:2015-09-19 14:47:08
【问题描述】:

这里是初学者。

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

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

应用程序在一段时间内正常工作,当新数据到达提要时,会尽职尽责地打印单元格值的变化。然后,它总是会产生一个错误:

“Microsoft Jet Engine 找不到对象 '(unknown)' 确保该对象存在并且您正确拼写了它的名称和路径名。”

文件路径都是绝对的。

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

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

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

我希望应用程序“无头”运行并仅重试连接数据库。

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

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

在此向您询问有关恐龙骨骼技术的问题,提前致歉。我需要查询实时数据这一事实导致我对 ODBC 进行了反复试验(libxl 只看到文件数据和公式,而不是它们的值)。

【问题讨论】:

    标签: c++ excel visual-studio-2010 mfc odbc


    【解决方案1】:

    你应该像这样处理CDBException

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

    【讨论】:

    • 安德鲁,谢谢,但我试过了。如果我在进行查询时在电子表格中的任何单元格中输入内容,Jet 错误对话框仍然会出现,如果我“取消”而不是将其重新指向 Excel 文件,则应用程序将退出。如果我键入“快速”(不到 1 秒),则永远不会出现错误。这类似于:如果您正在编辑一个单元格,则该文件是不可见的。
    • 这里需要提供源代码。所以我们可以帮助你。
    【解决方案2】:

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

    因此,您可以在应用程序中通过 ODBC 从 Visual C++ 查询 Excel 电子表格,该应用程序对于人们不小心触摸电子表格中的键或单元格更新(此处为来自市场数据馈送)会导致令人讨厌的“非现有链接”错误。它不是特别优雅,但速度很快,而且到目前为止还很健壮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多