首页 > 解决方案 > 是否可以将回调函数与 sqlite_prepare_v2() 结合使用

问题描述

所以我在参数化查询方面遇到了一些问题,并将它们与 C 中的回调函数结合起来。

因此,使用 sqlite3_exec(...) 您可以执行 SQL 查询并提供回调函数作为参数。回调函数用于打印查询输出

但是我想使用参数化查询,所以我必须使用 sqlite3_prepare_v2(),它是 sqlite3_bind 函数之一,sqlite3_step() 和 sqlite3_finalize(),它们不支持回调函数作为参数。

是否有另一个功能可以让我两全其美?(旁注:我尝试执行的 SQL 语句只是单行查询)

标签: csqlitecallback

解决方案


请注意API 文档中sqlite3_exec()的主要注释:

sqlite3_exec() 接口是对 sqlite3_prepare_v2()、sqlite3_step() 和 sqlite3_finalize() 的便捷包装,它允许应用程序运行多个 SQL 语句而无需使用大量 C 代码。

你应该从中得到的东西包括:

  • 基于回调的接口不是主要的 API。
  • 它是根据其他可访问函数编写的,因此您可以编写自己的类似函数来提供您想要的任何回调接口。

如果您确实需要一个与参数化准备好的语句一起使用的回调接口,那么您确实需要编写一个适合sqlite3_exec()自己的类似物。如果您想尽可能接近,sqlite3_exec()那么您可以使用类似的签名,用一个指向(已经准备好并填充的)准备好的语句的指针代替前两个参数。然后,该函数需要通过多次调用来执行查询sqlite3_step(),每次都从结果行 ( sqlite3_column_sometype()*n) 中提取所需的数据,将它们传递给回调函数,并适当地处理回调的返回值。

那里有很大的定制空间,特别是如果您确实只有一个查询需要支持。例如,您可以将参数传递给函数,而不是要求它们预先绑定。您可能会很好地更改回调函数的签名以更好地匹配查询结果,如果只支持一个查询,则可能不需要告知列名。

如果事实证明您实际上知道每行应该调用的特定函数,那么它根本不必是回调接口,因为您会收到一个函数指针作为参数。在这种情况下,您可以直接调用该函数。


推荐阅读