小巧、快速、可靠。
選擇其中三項。

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_text64() 的第四個參數為負數,則字串的長度是到第一個零終止符之前的位元組數。如果 sqlite3_bind_blob() 的第四個參數為負數,則行為未定義。如果提供非負的第四個參數給 sqlite3_bind_text()、sqlite3_bind_text16() 或 sqlite3_bind_text64(),則該參數必須是假設字串以 NUL 終止時 NUL 終止符將出現的位元組偏移量。如果任何 NUL 字元出現在小於第四個參數值的位元組偏移量處,則結果字串值將包含嵌入的 NUL。涉及包含嵌入 NUL 的字串的表達式的結果未定義。

BLOB 和字串綁定介面的第五個參數控制或指示第三個參數所參考物件的生命週期。存在以下三種選項:(1) 可以傳遞一個解構器,在 SQLite 使用完 BLOB 或字串後釋放其記憶體。即使呼叫 bind 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。zeroblob 在處理過程中使用固定量的記憶體(只是一個整數來保存其大小)。Zeroblobs 的目的是作為 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()

另請參閱 物件常數函式 列表。