【问题标题】:Is it possible to use callback function in conjuction with sqlite_prepare_v2()是否可以将回调函数与 sqlite prepare v2() 结合使用
【发布时间】:2019-08-05 21:20:29
【问题描述】:

所以我在使用参数化查询并将它们与 C 中的回调函数结合时遇到了一些问题。

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

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

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

【问题讨论】:

  • 对最初提出的问题的简短回答:否。
  • 您在将标准准备语句 API 与回调函数结合时遇到的问题的本质是什么?如果正如我将您解释为您所说的那样,无论如何您只想执行一个 SQL 语句,您寻求获得什么优势? 那些是我们可以帮助您的事情。
  • 问题是:1)我正在编写的函数需要我使用回调函数来打印输出。 -> 问题 1:如果我使用参数化查询,这还不够。 2)如果我使用参数化查询,我不太确定如何打印出 SQL 查询输出(所有列)。
  • 使用sqlite3_column_XXX() 函数在您逐步浏览结果行时访问返回值。

标签: c sqlite callback


【解决方案1】:

注意the API docs for sqlite3_exec()的前导备注:

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

你应该从中带走的东西包括:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2015-01-02
    • 2019-02-15
    • 2020-09-17
    相关资源
    最近更新 更多