c++ - 旧版 MySQL 连接器 C++ 使用 sql::ConnectOptionsMap 异常

标签 c++ mysql mysql-connector

已经两天了,我试图理解为什么会发生这种情况,但是我没有足够的调试技能来理解为什么会发生这种情况。

我需要使用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 */
        }

有人遇到过这种情况吗?我已经搜索了很多,直到现在才发现有人遇到这个问题。

我真的无法理解为什么会发生这种情况,因为没有任何自定义,只是文档中的一个示例......

请指教。

最佳答案

我终于找到了这个问题的答案,但没有任何地方记录。您可以使用“sql::ConnectOptionsMap connection_properties;” 仅当您静态链接库时。 (mysqlcppconn-static.lib)

我是怎么发现这个的?以下惊人信息来自:http://www.voidcn.com/article/p-yltwwlte-pd.html

引用:

The strings used in the interface are all SQLString. Although it is a further wrapper of std::string, it is impossible to pass a std::string object as a parameter. Because it is a way of dynamic linking, the memory management in the DLL has no connection with the EXE. Passing the object in the past will cause an exception: bad_alloc

但是,我确实测试了文章中的代码并将其添加到 mysql_connection.cpp 中,错误消失了,但它仍然无法工作。

我的警告:

我正在构建自己的“调试”版本的 mysql-connector-cpp-master,并且由于某种原因编译不“按预期”。例如,在我的编译中,“mysqlcppconn-static.lib”无法编译为 Debug,只能编译为“RelWithDebInfo”,并且只有 10 MB,而“官方”则为 64 MB。

结论:

您必须从 MySQL 网站静态链接发布版本 (mysqlcppconn-static.lib) 才能使用“sql::ConnectOptionsMap”。我真的希望他们能够醒来并为人员和文档创建一个适当的库。

如果我能找到一种在 Debug模式下构建它的方法,我将发布更新。

关于c++ - 旧版 MySQL 连接器 C++ 使用 sql::ConnectOptionsMap 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53996316/

相关文章:

python - pybind11 - 如果访问了结构的任何成员,则 boost::optional 结构的 std::vector 成员将被清空

c++ - QT 插槽和信号,显示第二个窗体/窗口

c++ - 编译 C++ 程序

php - 尝试在 Laravel 中的一对多关系中查找子记录的父记录时获取 null

c# - 如何连接MySQL数据库?

从文件到 8 位字符到文件的 C++ 32 位整数-程序在某个整数处崩溃

mysql - Python Flask 将数据插入 MySQL

php - SQL时间戳查询

python - 使用 Python mysql.connector 远程连接 MySQL

c++ - 我应该在 MySQL connector/c++ 中使用哪个执行函数?