【发布时间】:2026-01-09 19:50:02
【问题描述】:
我正在尝试运行以下行:
"ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old"
flocksStartWeight 是一个空的 sqlite(3.15.2) 表。 当我在 sqlite db 浏览器中运行它时,它可以重命名,但是当我尝试从我的 qt 应用程序运行它时,它会失败并显示警告。:
“警告:DatabaseConnectionImplementation::executeQuery: 失败 查询“更改表flocksStartWeight重命名为flocksStartWeight_old”, () WARNING: "No query Unable to fetch row"
相关代码:
执行查询调用
bool query2Successful = db->executeQuery("ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old")->isValid();
方法
DatabaseResultUPtr DatabaseConnectionImplementation::executeQuery(const QString& query, const QVariantList& args)
{
QMutexLocker tsLocker(&tsLock);
if (!db.isOpen())
{
hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << "DatabaseConnectionImplementation::executeQuery: Failed, database " << dbName << " not open";
return DatabaseResultUPtr(new DatabaseResult());
}
QSqlQuery q(db);
q.prepare(query);
for(int i = 0 ; i < args.size() ; i++)
q.bindValue(i, args.value(i));
if (!q.exec())
{
hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << "DatabaseConnectionImplementation::executeQuery: Failed for query " << q.executedQuery() << ", " << args;
hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << q.lastError().text();
return DatabaseResultUPtr(new DatabaseResult());
}
QMutexLocker scoped_lock(&queryMutex);
++queryCount;
return DatabaseResultUPtr(new DatabaseResult(q, this));
}
我做了很多类似的重命名,它们都运行良好。 唯一的区别是flocksStartWeight 不包含任何数据。所以我手动在表格中添加了一行并再次尝试。这次它工作得很好。 我应该如何重命名一个空表? 编辑:
我补充说:
if(!q.prepare(query))
{
qDebug() << "Preparing query failed for " << query;
}
它到达查询的 qDebug 行,所以它在 prepare 方法上已经失败了。
编辑: 当我问这个问题时,我假设数据库状态是错误的。问题无法重现,问题可以删除。
【问题讨论】:
-
也许您的 SQLite 浏览器的 SQLite 版本与您的 Qt 插件使用的不同?
-
你的 Qt 版本是多少?
-
当
QSqlQuery::exec()被调用时,查询的最后一个错误被重置..现在你添加了prepare()的检查..它在这里你应该显示最后一个错误..(即在 exec()) 之前。您现在看到的错误可能并没有传达出太多关于问题的信息。 -
"question can be removed" 为什么不自己删除(当然如果确实需要删除的话)?这比等待版主看到您的编辑更简单、更快捷:)
-
@Fareanor 你不能自己删除一个有赏金的问题。