小巧、快速、可靠。
三选其一。

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 表示字母数字标识符。这些参数的值(也称为“主机参数名称”或“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() 中,是第六个参数中指定的字节序。如果 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_UTF8SQLITE_UTF16SQLITE_UTF16BESQLITE_UTF16LE 之一,以指定第三个参数中文本的编码。如果 sqlite3_bind_text64() 的第六个参数不是上面显示的允许值之一,或者文本编码与第六个参数指定的编码不同,则行为未定义。

sqlite3_bind_zeroblob() 例程绑定一个长度为 N 的 BLOB,该 BLOB 用零填充。zeroblob 在被处理时使用固定数量的内存(只是一个保存其大小的整数)。zeroblob 旨在充当 BLOB 的占位符,这些 BLOB 的内容后来使用 增量 BLOB I/O 例程写入。zeroblob 的负值会导致零长度的 BLOB。

sqlite3_bind_pointer(S,I,P,T,D) 例程导致 准备好的语句 S 中的第 I 个参数具有 SQL 值为 NULL,但也要与类型为 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()

另请参阅 对象常量函数 的列表。