我在尝试让准备好的语句与 MySQL++ 一起使用时遇到了麻烦。我知道 MySQL++ 对准备好的语句没有原生支持,所以我认为一个简单的解决方案就是使用原始 SQL 创建准备好的语句。
例如,以下代码可以正常工作:
string* DatabaseCore::SaveNewInformation(const char * information)
{
if (connection->connected())
{
Query query = connection->query("SELECT UUID();");
string * guid = nullptr;
if (StoreQueryResult res = query.store())
{
Row row = (*res.begin());
guid = new string(row[0]);
}
else
{
UpdateErrorInformationToLastFailedQuery(query);
return nullptr;
}
stringstream query_string;
query_string << "PREPARE save_info FROM 'INSERT INTO " << ENIGMA_TABLE_NAME << " VALUES ( ?, ? )'; ";
query_string << "SET @guid = '" << *guid << "'; ";
query_string << "SET @info = '" << information << "'; ";
query_string << "EXECUTE save_info USING @guid, @info; ";
query_string << "DEALLOCATE PREPARE save_info; ";
query.reset();
query = connection->query(query_string.str());
if (query.execute())
{
return guid;
}
else
{
delete guid;
UpdateErrorInformationToLastFailedQuery(query);
}
}
ErrorMessage = "Not connected to the database.";
return nullptr;
}
执行得很好,没有返回错误,并且成功地将新行插入到数据库中,正如人们所期望的那样。
我的问题是当我尝试以这种方式执行准备好的语句但期望它返回信息时。有问题的代码如下:
stringstream query_string;
query_string << "PREPARE get_info FROM 'SELECT Information FROM " << ENIGMA_TABLE_NAME << " WHERE (Id = ?)'; ";
query_string << "SET @guid = '" << guid << "'; ";
query_string << "EXECUTE get_info USING @guid; ";
query_string << "DEALLOCATE PREPARE get_info; ";
Query query = connection->query( query_string.str() );
std::cout << (query.more_results() ? "More Results" : "No Results") << std::endl; // Outputs "No Results"
StoreQueryResult res = query.store();
std::cout << res.num_rows() << std::endl; // Returns Zero
因此,虽然此代码正确执行且没有错误,但它不会返回任何结果。我知道生成的查询字符串是正确的,例如,如果我将该查询字符串输出到文件中并将其粘贴到 MySQL 工作台中,它会按我的预期返回信息。如果我将连接上的 MultiStatementsOption 选项设置为 true,问题仍然存在。我想知道如何像这样在 MySQL++ 中使用准备好的语句,并能够从执行的语句中检索信息。
感谢您的任何帮助,您可以提供。