1

我正在帮助一位朋友完成他的学士论文项目。这是一个计算各种材料弯矩的程序。客户期望的额外要求之一是存储和检索程序中使用的各种数据的数据库功能。

该程序是用托管 C++ 编写的表单应用程序。我加入进来帮助编写数据库功能。我正在使用 MySQL Server 5.5 和 MySQL Connector/C++ 来桥接程序和数据库。一切进展顺利,我们需要的所有功能都可以正常工作,但仅限于调试。一旦我们将程序置于发布模式,运行时就会出现未定义的行为。以下是用于打开与数据库的连接的函数:

try
{
    m_driver = get_driver_instance();
    m_conn = m_driver->connect(m_dbHost, m_dbUser, m_dbPwd);
    m_conn->setSchema(m_dbSchema);
}
catch(sql::SQLException &e)
{
    int a = e.getErrorCode();
    MessageBoxA(NULL, e.what(), "DB Error", MB_OK);
}

传递给连接函数的值都是 std::string。在调试模式下,连接没有问题。在发布模式下,调用 connect 函数后会捕获异常,并显示消息“Unknown MySQL Server Host '####' (0)”,其中 #### 始终是一些垃圾文本。我还注意到在输出窗口中抛出了另一个异常,这个异常是 System.Runtime.InteropServices.SEHException 类型。

我一直在做一些研究,并在许多论坛(以及这里的堆栈交换)上看到了许多这种异常的案例,但似乎没有人对 MySQL 连接器有这个问题。我的假设是内存被损坏,因为程序是混合模式,主程序代码是用托管 C++ 编写的,而我的数据库帮助程序代码是本机 C++(根据连接器的要求)。

是否可以在我的代码中更改某些内容以尝试解决此问题,以确保字符串在运行时不会被损坏。我尝试了许多不同的技巧来尝试解决问题,但没有任何效果。

谢谢,汤姆

更新:我现在在调试模式下看到此错误。我添加了代码以从数据库中检索值并填充表单上的一些文本框。代码如下:

             // Populate the form with material details
             String^ selectedMaterial = (String^)(comboBox1->SelectedItem);
             string selectedMaterial_ = "";
             MarshalString(selectedMaterial, selectedMaterial_);

             sql::ResultSet* results = dbHelper.GetData("matname", selectedMaterial_);
             if (results->rowsCount() == 1)
             {
                 // Outdim
                 string outdim_ = "";
                 outdim_ = results->getString("outdim");

                 String^ outdim = gcnew String(outdim_.c_str());
                 textBox1->Text = outdim;
             }
             else
             {
                 // !!!! Duplicate materials in list
             }

当它试图从结果集中读取 outdim 时,会抛出 SEHException,并且给出的唯一其他信息是它是在外部组件中抛出的。

更新 2:我针对调试可执行文件运行 Application Verifier,然后从 VS2010 启动该程序。但是,表单窗口永远不会加载,因此程序必须在某处停止。奇怪的是,Application Verifier 的日志文件中绝对没有任何信息。我也尝试过发布版本,但我也没有从中获得任何有用的信息。

4

0 回答 0