c - 是否可以将回调函数与 sqlite_prepare_v2() 结合使用
问题描述
所以我在参数化查询方面遇到了一些问题,并将它们与 C 中的回调函数结合起来。
因此,使用 sqlite3_exec(...) 您可以执行 SQL 查询并提供回调函数作为参数。回调函数用于打印查询输出
但是我想使用参数化查询,所以我必须使用 sqlite3_prepare_v2(),它是 sqlite3_bind 函数之一,sqlite3_step() 和 sqlite3_finalize(),它们不支持回调函数作为参数。
是否有另一个功能可以让我两全其美?(旁注:我尝试执行的 SQL 语句只是单行查询)
解决方案
请注意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) 中提取所需的数据,将它们传递给回调函数,并适当地处理回调的返回值。
那里有很大的定制空间,特别是如果您确实只有一个查询需要支持。例如,您可以将参数传递给函数,而不是要求它们预先绑定。您可能会很好地更改回调函数的签名以更好地匹配查询结果,如果只支持一个查询,则可能不需要告知列名。
如果事实证明您实际上知道每行应该调用的特定函数,那么它根本不必是回调接口,因为您会收到一个函数指针作为参数。在这种情况下,您可以直接调用该函数。
推荐阅读
- javascript - 将事件传递给 React 中的嵌套函数并且没有获得外部事件值
- python - 删除开头和结尾相同的字符串的可变部分
- php - 在 erb 视图中从 onclick 运行 bash 脚本
- qt - QML WindowApplication 在设置窗口工具栏时使用 SplitView 进行奇怪的大小调整行为
- netsuite - DocuSign API:将 NetSuite 文档上传到信封
- javascript - Chart.js 堆叠折线图,具有不同样式的部分
- c# - 表单关闭后 C# 进程未恢复到任务栏
- python - 为什么python“导入平台”模块会导致重复/重复打印?
- python - 打破循环并获得单一结果
- graphql - gatsby.js - 高级入门 - 实现 2 个 url 前缀(站点的 2 个不同部分)?