直接使用mysql软件向两个表写入内容成功,为什么使用下面代码,第一个表写入中文没有问题,第二个就有问题,bool DatabaseWriter::writeToDatabase(const SchemeRunResult& task)
{
MYSQL* conn = connectionPool.getConnection();
if (!conn) {
LWARN("获取数据库连接失败");
return false;
}
LWARN("开始事务");
// 开始事务
if (mysql_query(conn, "START TRANSACTION"))
{
char error_msg[512];
snprintf(error_msg, sizeof(error_msg), "开始事务失败 - 错误代码: %d, 错误信息: %s",
mysql_errno(conn), mysql_error(conn));
LWARN(error_msg);
connectionPool.releaseConnection(conn);
return false;
}
bool success = false;
int lastInsertId = 0;
try {
// 插入测试结果
lastInsertId = insertTestResult(conn, task);
//LWARN("插入测试结果,返回ID: " + QString::number(lastInsertId).toUtf8());
if (lastInsertId <= 0)
{
throw std::runtime_error("插入测试结果失败");
}
if (!task.Result && !task.ListDefect.isEmpty())
{
//LWARN("开始插入缺陷数据,数量: " + QString::number(task.ListDefect.size()).toUtf8());
// 插入缺陷数据
if (!insertDefects(conn, lastInsertId, task.ListDefect))
{
throw std::runtime_error("插入缺陷数据失败");
}
LWARN("缺陷数据插入成功");
}
// 提交事务
if (mysql_query(conn, "COMMIT"))
{
throw std::runtime_error("提交事务失败");
}
//LWARN("数据写入成功,测试记录ID: " + QString::number(lastInsertId).toUtf8());
success = true;
}
catch (const std::exception& e)
{
char error_msg[512];
snprintf(error_msg, sizeof(error_msg), "数据库操作异常: %s", e.what());
LWARN(error_msg);
mysql_query(conn, "ROLLBACK");
LWARN("事务已回滚");
// 输出详细的MySQL错误信息
snprintf(error_msg, sizeof(error_msg), "MySQL错误 - 代码: %d, 信息: %s",
mysql_errno(conn), mysql_error(conn));
LWARN(error_msg);
}
connectionPool.releaseConnection(conn);
return success;
}
bool DatabaseWriter::insertTestResult(MYSQL* mysql, const SchemeRunResult& task)
{
char buffer[2048] = "";
// 转义字符串防止SQL注入
char escapedScheme[256] = { 0 };
char escapedStation[256] = { 0 };
char escapedType[256] = { 0 };
mysql_real_escape_string(mysql, escapedScheme, task.schemeName.toUtf8().constData(), task.schemeName.length());
mysql_real_escape_string(mysql, escapedStation, task.StationName.toUtf8().constData(), task.StationName.length());
mysql_real_escape_string(mysql, escapedType, task.typeName.toUtf8().constData(), task.typeName.length());
sprintf(buffer,
"INSERT INTO test_results (result, scheme_name, station_name, type_name, test_time, test_take_time) "
"VALUES (%d, '%s', '%s', '%s', '%s', %d)",
task.Result ? 1 : 0,
escapedScheme,
escapedStation,
escapedType,
task.sTestTime.toStdString().c_str(),
task.nTestTakeTime
);
if (mysql_query(mysql, buffer))
{
char error_msg[512];
snprintf(error_msg, sizeof(error_msg), "插入测试结果失败 - 错误代码: %d, 错误信息: %s, SQL: %s",
mysql_errno(mysql), mysql_error(mysql), buffer);
LWARN(error_msg);
return 0;
}
return mysql_insert_id(mysql);
}
bool DatabaseWriter::insertDefects(MYSQL* mysql, int testResultId, const QList<QString>& defects)
{
for (const QString& defect : defects)
{
if (defect.isEmpty()) continue;
char buffer[512] = "";
char escapedDefect[256] = { 0 };
mysql_real_escape_string(mysql, escapedDefect, defect.toUtf8().constData(), defect.length());
snprintf(buffer, sizeof(buffer),
"INSERT INTO defects (test_result_id, defect_name) "
"VALUES (%d, '%s')",
testResultId,
escapedDefect
);
if (mysql_query(mysql, buffer))
{
char error_msg[512];
snprintf(error_msg, sizeof(error_msg), "插入缺陷数据失败 - 错误代码: %d, 错误信息: %s, SQL: %s",
mysql_errno(mysql), mysql_error(mysql), buffer);
LWARN(error_msg);
return false;
}
}
return true;
}
为什么只有写入defect_name异常呢
最新发布