VC ++和MySQL C ++ Connector的Interop异常

时间:2012-04-19 11:12:23

标签: c++ mysql visual-c++

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

该程序是一个用托管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);
}

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

我一直在做一些研究,并且已经在很多论坛上看到了很多这种例外的情况(这里是堆栈交换),但似乎没有人在MySQL连接器上遇到这个问题。我的假设是内存被破坏,因为程序是混合模式,主程序代码是用Managed 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中的日志文件中绝对没有信息。我也尝试了发布版本,但我也没有从中获得任何有用的信息。

0 个答案:

没有答案