SQLite C 接口
将值绑定到准备好的语句
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, void(*)(void*)); int sqlite3_bind_double(sqlite3_stmt*, int, double); int sqlite3_bind_int(sqlite3_stmt*, int, int); int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); int sqlite3_bind_null(sqlite3_stmt*, int); int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, void(*)(void*), unsigned char encoding); int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64);
在sqlite3_prepare_v2()及其变体的 SQL 语句文本输入中,文字可能会被匹配以下模板之一的参数替换:
- ?
- ?NNN
- :VVV
- @VVV
- $VVV
在上面的模板中,NNN 表示整数文字,VVV 表示字母数字标识符。这些参数的值(也称为“主机参数名称”或“SQL 参数”)可以使用此处定义的 sqlite3_bind_*() 例程进行设置。
sqlite3_bind_*() 例程的第一个参数始终是指向从sqlite3_prepare_v2()或其变体返回 的sqlite3_stmt对象的指针。
第二个参数是要设置的 SQL 参数的索引。最左边的 SQL 参数的索引为 1。当多次使用同名 SQL 参数时,第二次和后续出现的索引与第一次出现的索引相同。如果需要,可以使用sqlite3_bind_parameter_index() API查找命名参数的索引 。“?NNN”参数的索引是 NNN 的值。NNN 值必须介于 1 和sqlite3_limit() 参数SQLITE_LIMIT_VARIABLE_NUMBER(默认值:32766)之间。
第三个参数是绑定到参数的值。如果 sqlite3_bind_text() 或 sqlite3_bind_text16() 或 sqlite3_bind_blob() 的第三个参数是 NULL 指针,那么第四个参数将被忽略,最终结果与 sqlite3_bind_null() 相同。如果 sqlite3_bind_text() 的第三个参数不是 NULL,那么它应该是一个指向格式良好的 UTF8 文本的指针。如果 sqlite3_bind_text16() 的第三个参数不是 NULL,那么它应该是一个指向格式良好的 UTF16 文本的指针。如果 sqlite3_bind_text64() 的第三个参数不是 NULL,那么它应该是一个指向格式正确的 unicode 字符串的指针,如果第六个参数是 SQLITE_UTF8,则它是 UTF8,否则是 UTF16。
UTF16 输入文本的字节顺序由第一个字符中的字节顺序标记(BOM、U+FEFF)确定,该标记已被删除,或者在没有 BOM 的情况下,字节顺序是主机的本机字节顺序sqlite3_bind_text16() 的机器或 sqlite3_bind_text64() 的第 6 个参数中指定的字节顺序。如果 UTF16 输入文本包含无效的 unicode 字符,则 SQLite 可能会将这些无效字符更改为 unicode 替换字符:U+FFFD。
在那些有第四个参数的例程中,它的值是参数中的字节数。要清楚:该值是字节数在值中,而不是字符数。如果 sqlite3_bind_text() 或 sqlite3_bind_text16() 的第四个参数是负数,则字符串的长度是第一个零终止符之前的字节数。如果 sqlite3_bind_blob() 的第四个参数为负,则行为未定义。如果向 sqlite3_bind_text() 或 sqlite3_bind_text16() 或 sqlite3_bind_text64() 提供了一个非负的第四个参数,那么该参数必须是假设字符串以 NUL 终止的情况下 NUL 终止符出现的字节偏移量。如果任何 NUL 字符出现在小于第四个参数值的字节偏移处,则生成的字符串值将包含嵌入的 NUL。涉及嵌入 NUL 的字符串的表达式的结果是未定义的。
BLOB 和字符串绑定接口的第五个参数控制或指示第三个参数引用的对象的生命周期。存在这三个选项:(1) 可以传递在 SQLite 完成处理后处理 BLOB 或字符串的析构函数。即使对绑定 API 的调用失败,也会调用它来处理 BLOB 或字符串,除非如果第三个参数是 NULL 指针或第四个参数为负,则不会调用析构函数。(2) 特殊常量,SQLITE_STATIC, 可能会被传递以指示应用程序仍然负责处理对象。在这种情况下,对象和提供的指向它的指针必须保持有效,直到准备好的语句完成或相同的 SQL 参数绑定到其他东西,以先发生者为准。(3)可以传递常量SQLITE_TRANSIENT以指示对象将在从 sqlite3_bind_*() 返回之前被复制。对象和指向它的指针必须在此之前保持有效。然后 SQLite 将管理其私有副本的生命周期。
sqlite3_bind_text64() 的第六个参数必须是 SQLITE_UTF8、SQLITE_UTF16、SQLITE_UTF16BE或SQLITE_UTF16LE 之一, 以指定第三个参数中文本的编码。如果 sqlite3_bind_text64() 的第六个参数不是上面显示的允许值之一,或者如果文本编码与第六个参数指定的编码不同,则行为未定义。
sqlite3_bind_zeroblob() 例程绑定了一个长度为 N 并用零填充的 BLOB。zeroblob 在处理时使用固定数量的内存(只是一个整数来保存它的大小)。Zeroblob 旨在用作 BLOB 的占位符,其内容稍后使用 增量 BLOB I/O例程写入。zeroblob 的负值会导致长度为零的 BLOB。
sqlite3_bind_pointer(S,I,P,T,D) 例程导致 准备语句S 中的第 I 个参数具有 NULL 的 SQL 值,但也与类型 T 的指针 P 相关联。D 是 NULL指针或指向 P 的析构函数的指针。当 SQLite 完成使用 P 时,它将使用 P 的单个参数调用析构函数 D。T 参数应该是静态字符串,最好是字符串文字。sqlite3_bind_pointer() 例程是 为 SQLite 3.20.0 添加的指针传递接口的一部分。
如果调用任何 sqlite3_bind_*() 例程时使用准备语句的 NULL 指针或使用 最近调用 sqlite3_step() 的准备语句而不是sqlite3_reset (),则调用将返回SQLITE_MISUSE。如果任何 sqlite3_bind_() 例程被传递一个已经完成的准备好的语句,结果是未定义的并且可能是有害的。
sqlite3_reset()例程不会清除绑定。未绑定的参数被解释为 NULL。
sqlite3_bind_* 例程在成功 时返回SQLITE_OK或在出现任何问题时 返回错误代码。如果字符串或 BLOB 的大小超过sqlite3_limit ( SQLITE_LIMIT_LENGTH ) 或 SQLITE_MAX_LENGTH施加的限制,则可能会返回SQLITE_TOOBIG。 如果参数索引超出范围,则返回 SQLITE_RANGE 。如果 malloc() 失败,则返回SQLITE_NOMEM 。
另请参阅:sqlite3_bind_parameter_count()、 sqlite3_bind_parameter_name()和sqlite3_bind_parameter_index()。