Устаревший MySQL Connector C ++, использующий исключение sql :: ConnectOptionsMap - PullRequest
0 голосов
/ 01 января 2019

Уже 2 дня я пытаюсь понять, почему это происходит, однако у меня недостаточно навыков отладки, чтобы понять, почему это происходит.

Мне нужно использовать sql:: ConnectOptionsMap , чтобы я мог передать нужные параметры подключения, такие как кодировка и т. Д.

Простой пример:

sql::ConnectOptionsMap connection_properties;

connection_properties["hostName"] = sql::SQLString("localhost");
connection_properties["userName"] = sql::SQLString("username");
connection_properties["password"] = sql::SQLString("password");
connection_properties["CLIENT_MULTI_STATEMENTS"] = (true);

sql::Driver * driver = get_driver_instance();
std::unique_ptr<sql::Connection> con(driver->connect(connection_properties));

Скомпилировано с VS 2017, в режиме отладки:

Exception thrown at 0x00007FFFECC811D0 (vcruntime140d.dll) in Demo.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

После создания некоторых "мини-дампов" я вижу, что здесь происходит сбой кода:

    _NODISCARD static _CONSTEXPR17 int compare(_In_reads_(_Count) const char * const _First1,
        _In_reads_(_Count) const char * const _First2, const size_t _Count) noexcept // strengthened
        {   // compare [_First1, _First1 + _Count) with [_First2, ...)
#if _HAS_CXX17
        return (__builtin_memcmp(_First1, _First2, _Count));
#else /* _HAS_CXX17 */
        return (_CSTD memcmp(_First1, _First2, _Count)); <-- HERE
#endif /* _HAS_CXX17 */
        }

Кто-нибудь сталкивался с этим раньше?Я много искал и не мог найти никого, кто имел бы эту проблему до сих пор.

Я действительно не могу понять, почему это происходит, поскольку нет ничего нестандартного, просто пример из документации ...

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 02 января 2019

Я наконец нашел ответ на эту проблему, которая нигде не задокументирована.Вы можете использовать "sql :: ConnectOptionsMap connection_properties;" ТОЛЬКО если вы статически связываете библиотеку.(mysqlcppconn-static.lib)

Как я это узнал?Следуя этой удивительной информации из: http://www.voidcn.com/article/p-yltwwlte-pd.html

Цитата:

Все строки, используемые в интерфейсе, являются SQLString.Хотя это еще одна оболочка std :: string, невозможно передать объект std :: string в качестве параметра.Поскольку это способ динамического связывания, управление памятью в DLL не связано с EXE.Передача объекта в прошлом вызовет исключение: bad_alloc

Я, однако, проверил код из статьи и добавил в mysql_connection.cpp, и ошибка исчезла, но она все равно не будет работать.

Мое предостережение:

Я создавал свою собственную версию "отладки" mysql-connector-cpp-master, и по какой-то причине компиляция не "такожидается».Например, в моей компиляции «mysqlcppconn-static.lib» не может быть скомпилирован как Debug, только «RelWithDebInfo» и составляет всего 10 МБ, а «официальный» - 64 МБ.

Вывод:

Вы должны статически связать версию выпуска (mysqlcppconn-static.lib) с веб-сайта MySQL, чтобы использовать «sql :: ConnectOptionsMap».Я действительно надеюсь, что они проснутся и сделают правильную работу для людей и документации.

Если я найду способ построить это в режиме отладки, я опубликую обновление.

...