清除Qt中的SQL查询

3
什么是两者之间的区别?
void QSqlQuery::clear ()

并且

void QSqlQuery::finish ()

基于文档,我没有看到它们之间的区别。那它们有什么区别呢? 我想知道具体在何时使用其中之一。 编辑 - 文档中的更多阐述和信息。 clear() -清除结果集并释放查询所持有的任何资源。 听起来finish()也是这样做的...
-将查询状态设置为非活动状态。 finish也是这样做的。 finish() -告诉数据库驱动程序不会再从此查询中获取更多数据,直到重新执行该查询为止。 这具体意味着什么?这有什么后果? -如果您打算稍后重新使用查询,则释放资源(例如锁定或游标)可能会有所帮助。 清除是否也是这样做的?清除是否释放锁定、游标等? -将查询设置为非活动状态。 我认为清除也是这样做的。
-绑定值保留其值。 这有什么意义?
3个回答

6

Qt自带源代码,你可以通过查看qsqlquery.cpp文件来了解它与其他的区别。

因此,根据源代码:

  • clear - 清除并重置QSqlQuery对象;
  • finish - 将当前查询的结果成员重置为非活动状态;

希望这能有所帮助,谢谢!


1
谢谢。说实话,我仍然不知道它们之间的区别。这里使用的语言非常通用和抽象,对我来说毫无意义。“重置结果成员”对我来说毫无意义。如果他们的意思是返回的结果(QSqlQuery也作为迭代器),那么.clear()是否也会做同样的事情?我认为是的。此外,它们似乎都将查询设置为非活动状态。“清除并重置查询”与finish()有何不同?这只是Nokia的胡言乱语。我想知道何时使用其中一个而不是另一个。 - user440297
1
这两者是不同的,因为clear会重置整个对象,而finish只会重置其result成员。Qt文档可能不够清晰,但是(正如我所说),您始终可以查看源代码,我相信这比任何文档都要好。顺便说一句,在这两种情况下,文档都提到您很少需要调用这些函数,这也解释了为什么Qt团队没有花费大量时间对它们进行文档记录。 - serge_gubenko

2

描述这些函数所使用的语言相似,因此可能会有点混淆,我希望这个解释能够帮助您。以下是我对这些方法的理解和使用方式。

void QSqlQuery::finish ()

我认为这是一种表达方式,表示我已经完成了刚刚请求的查询(例如不再阅读/迭代),但我仍然计划使用该QSqlQuery对象来进行更多的工作。你只是释放了用于获取先前查询的值的任何内存/资源。当你一遍又一遍地处理大型数据集时,这才真正产生明显的差异,但我认为无论如何使用这种方法都是好的实践。

void QSqlQuery::clear ()

这是我的一种表达方式,意思是我已经完成了QSqlQuery对象的使用,并希望确保在释放该对象时不会留下任何我正在使用的资源/内存。我很少使用它,因为我发现它的效果因所使用的数据库和是否使用现代C++功能而变化很大。
如果你把它们看作是解决两个不同时间段(例如旧的C代码与现代C++)类似问题的编写方法,就更容易理解它们之间的差异了。
它们做的事情非常相似,但我建议您只使用finish()方法。

0

对于像我一样想知道应该调用哪种方法的人,我将分享我的研究。

注意:我阅读了SQLite驱动程序的源代码,因此其他数据库驱动程序可能会有所不同。

  • finish() 重置语句;在SQLite上下文中,它调用sqlite3_reset
  • clear() 重置整个QSqlQuery对象;它清除绑定值、准备好的语句、lastError()、lastQuery()等,为所有对象参数设置默认选项;在SQLite上下文中,我认为也会调用sqlite3_finalize

因此,我应该将其视为finish < clear。在finish()之后,您可以调用exec()重新执行查询,但在clear()之后,您必须再次准备查询并绑定其值,然后才能成功地重新执行查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接