#c #mysql
#c #mysql
Вопрос:
В настоящее время я изучаю C и медленно добиваюсь прогресса, но возникают проблемы с операторами MySQL select и prepared.
У меня есть приложение, которое ссылается на библиотеку, и приложение вызывает библиотечную функцию следующим образом:
try
{
DynamicConfig dynamicConfig;
string value = "";
dynamicConfig.getValueFromDBConfig("Test Group", "TestName", amp;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.
Я не понимаю, почему это не работает, у него есть строка, и таблица базы данных, на которую я смотрю, определенно имеет столбец с именем Value .
Комментарии:
1. значение инициализируется пустой строкой и передается методу в качестве указателя. Значение в БД равно
Hello Value
. Я знаю об исключении, я также очистил его в обработчике исключений, но удалил его на случай, если это вызвало проблему2. Мне удалось найти ответ, я добавил ответ, на самом деле не понимаю, почему это исправляет его, хотя пример MySQL не делает то, что я должен был сделать
Ответ №1:
В конце концов удалось это выяснить. Мне нужно запустить getstring следующим образом
*value = resultset->getString("Value").c_str()
Я не понимаю, зачем мне это нужно, пример кода MySQL, который я использовал из https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-results.html этого не видно, так что если кто-то сможет пролить на это некоторый свет, это было бы здорово.