Сбои при запуске MySQL Connector/C++ из Visual Studio

У меня возникли некоторые проблемы с попыткой запустить скомпилированную программу, использующую коннектор MySQL, на С++. Он прекрасно компилируется, но при его запуске сразу же происходит сбой - по-видимому, на линии, предназначенной для подключения. Я настроил все дополнительные библиотеки, зависимости, препроцессоры и входные данные компоновщика и использую конфигурацию решения Release. Я использую Microsoft Visual Studio 2012.

Я получаю следующее сообщение об ошибке: Необработанное исключение по адресу 0x6E69AF48 (msvcr90.dll) в MyLittleSQL.exe: 0xC0000005: Местоположение чтения с нарушением прав доступа 0x00000024.

И стек вызовов:

MyLittleSQL.exe!main() Line 24 C++
MyLittleSQL.exe!__tmainCRTStartup() Line 536 C

Строка 24:

con = driver->connect("tcp://127.0.0.1:3306", "sepples_su", "easy");

И полный исходный код:

#include <stdlib.h>
#include <iostream>

#include "mysql_connection.h"
#include "mysql_driver.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
using namespace std;

int main(void)
{
    try 
    {
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;

        /* Create a connection */
        driver = get_driver_instance();
        con = driver->connect("tcp://127.0.0.1:3306", "sepples_su", "easy");

        /* Connect to the MySQL test database */
        con->setSchema("test");

        stmt = con->createStatement();
        res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
        while (res->next()) 
        {
            cout << "\t... MySQL replies: ";
            /* Access column data by alias or column name */
            cout << res->getString("_message") << endl;
            cout << "\t... MySQL says it again: ";
            /* Access column fata by numeric offset, 1 is the first column */
            cout << res->getString(1) << endl;
        }

        delete res;
        delete stmt;
        delete con;
    } 
    catch (sql::SQLException &e) 
    {
        cout << "# ERR: SQLException in " << __FILE__;
        cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
        cout << "# ERR: " << e.what();
        cout << " (MySQL error code: " << e.getErrorCode();
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    }

    cout << endl;
    return EXIT_SUCCESS;
}

На самом деле это один из примеров, взятых из документации Connector, но сначала я хотел убедиться, что это не моя вина.

Любая помощь здесь будет оценена, спасибо.


person mtaanquist    schedule 29.11.2012    source источник
comment
Компилируется ли библиотека DLL коннектора с помощью Visual Studio 2012? Использование библиотек, скомпилированных разными компиляторами, приводит к подобным сбоям.   -  person Lyubomir Vasilev    schedule 29.11.2012
comment
Есть ли способ проверить это? DLL была отправлена ​​скомпилированной через архив на mysql.com.   -  person mtaanquist    schedule 29.11.2012
comment
Вы уверены, что используете последнюю версию?   -  person Mark Garcia    schedule 29.11.2012
comment
@MadsT См. это, чтобы определить, с каким компилятором была собрана dll: компилятор построил win32 pe">stackoverflow.com/questions/764329/   -  person Lyubomir Vasilev    schedule 29.11.2012
comment
@MarkGarcia Да, я скачал последнюю версию Connector из MySQL и постоянно обновляю VS2012.   -  person mtaanquist    schedule 29.11.2012
comment
@LyubomirVasilev Взглянув на PEiD, он показывает Linker Info = 9.0, что, я думаю, является причиной сбоя и в msvcr90.dll. Я знаю, что это использовалось в VS2008, но будет ли это несовместимо с 2010/2012?   -  person mtaanquist    schedule 29.11.2012
comment
@MadsT Думаю, да. Я думаю, что ваша программа должна быть собрана с vs2008 для работы. Или dll можно собрать с помощью vs2012 (есть исходник, я не знаю). Не могли бы вы попробовать собрать свою программу с помощью vs2008, если она доступна?   -  person Lyubomir Vasilev    schedule 29.11.2012
comment
@LyubomirVasilev Большое спасибо! Я скомпилировал коннектор с нуля, используя VS11, и теперь он у меня работает. Очень признателен!   -  person mtaanquist    schedule 29.11.2012
comment
@Lyubomir Vasileve, у меня такая же проблема, и getString вылетает. Я пробовал все, но единственное оставшееся решение - скомпилировать коннектор самостоятельно. Я использую Visual Studio 13 и не знаю, как это сделать. Информация о компоновщике моей dll - 10.0.0. Можете ли вы показать мне, как скомпилировать это? Ссылка, предоставленная Мэдсом Таанквистом, перемещена и больше не существует.   -  person Programmer    schedule 28.05.2015
comment
@Programmer Вот новая ссылка dev .mysql.com/doc/connector-cpp/en/ . Однако я не проверял, но думаю, что даже с самой новой версией CMake вы можете использовать до Visual Studio 12 2013. Я не вижу Visual Studio 12 среди поддерживаемых здесь генераторов: cmake.org/cmake/help/v3.0/manual/cmake-generators.7.html .   -  person Lyubomir Vasilev    schedule 28.05.2015
comment
Спасибо за ссылку.   -  person Programmer    schedule 28.05.2015


Ответы (2)


С помощью @LyubomirVasilev я самостоятельно скомпилировал C++ Connector с настройками для Visual Studio 11 (2012). Заменив другие файлы lib и dll на скомпилированные здесь, после этого все заработало отлично.

Информацию о том, как это сделать, можно найти здесь для любых других: http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-info.html

person mtaanquist    schedule 29.11.2012

Последний коннектор C++ MySQL скомпилирован с библиотеками времени выполнения VC9 (Visual studio 2008). Visual Studio 2012 использует библиотеки VC11, поэтому очевидно, почему ваша программа дала сбой. Ваша программа должна использовать те же библиотеки времени выполнения, что и коннектор MySQL C++:

Необработанное исключение по адресу 0x6E69AF48 (msvcr90.dll) ‹--- VC9

Вы должны скомпилировать свою программу с помощью Visual Studio 2008, которая использует библиотеки VC9, или скомпилировать коннектор MySQL C++ из исходного кода с помощью Visual Studio 2012.

person BJovke    schedule 20.09.2015