MySQL resultset包含1行,但是调用getstring会导致访问冲突

MySQL resultset contains 1 row but calling getstring causes Access Violation

本文关键字:getstring 访问冲突 调用 包含 resultset 1行 MySQL      更新时间:2023-10-16

我目前正在学习c++并慢慢取得进展,但遇到MySQL选择和准备语句的问题。

我有一个应用程序链接到一个库和应用程序调用库函数如下:

try
        {
            DynamicConfig dynamicConfig;
            string value = "";
            dynamicConfig.getValueFromDBConfig("Test Group", "TestName", &value);
            stringstream logStream;
            logStream << "Dynamic Config Value: " << value;
            bitsLibrary.writeToLog(logStream.str());
        }
        catch (sql::SQLException ex)
        {
            cout << "SQL Exception: " << ex.what() << endl;
        }
        catch (exception ex)
        {
            cout << "General Exception: " << ex.what() << endl;
        }

在DynamicConfig类的库中,我有getValueFromDBConfig方法,其中包含以下内容:

bool DynamicConfig::getValueFromDBConfig(string groupName, string sectionName, string *value)
{
    //Connection *conn = NULL;
    PreparedStatement *statement = NULL;
    ResultSet *resultset = NULL;
    try
    {
        DBManager dbManager;
        Connection *conn = dbManager.getDriverConnection();
        statement = conn->prepareStatement("SELECT * FROM config_items, config_groups WHERE config_groups.Name=? AND config_items.Name=? AND config_groups.id = config_items.ConfigGroupID");
        statement->setString(1, groupName.c_str());
        statement->setString(2, sectionName.c_str());
        resultset = statement->executeQuery();
        cout << "Found " << resultset->rowsCount() << " rows" << endl;
        if (resultset->rowsCount() > 0)
        {
            while (resultset->next())
            {
                cout << "Value: " << resultset->getString("Value") << endl;
                *value = resultset->getString("Value");
            }
            delete conn;
            delete statement;
            delete resultset;
            return true;
        }
        else
        {
            bitsLibrary.writeToLog("No rows were returned", "DynamicConfig", "getValueFromDBConfig");
        }
    }
    catch (SQLException ex)
    {
        stringstream logStream;
        logStream << "Failed to get DB config value. SQL Exception: " << ex.what();
        bitsLibrary.writeToLog(logStream.str(), "DynamicConfig", "getValueFromDBConfig");
        throw ex;
    }
    catch (exception ex)
    {
        stringstream logStream;
        logStream << "Failed to get DB config value. General Exception: " << ex.what();
        bitsLibrary.writeToLog(logStream.str(), "DynamicConfig", "getValueFromDBConfig");
        throw ex;
    }
    return false;
}

它似乎成功地执行查询,因为它打印出1 rows到控制台,然而,当我调用resultset->getstring("Value")时,它抛出一个错误:

Exception thrown at 0x00007FFF7E831EBA (msvcp140d.dll) in TestApp.exe 0xC0000005. Access violation reading location 0xFFFFFFFFF.

我不明白为什么这是不工作,它有一行,我正在看的数据库表肯定有列称为值。

最后总算弄明白了。我需要像下面这样运行getstring

*value = resultset->getString("Value").c_str()

我不明白为什么我需要这样做,我从https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-results.html使用的MySQL示例代码没有显示这一点,所以如果有人能在这一点上透光,那将是伟大的。