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

SQLite C 介面 (SQLite C 介面/SQLite C API)

編譯 SQL 陳述式 (編譯 SQL 語句)

int sqlite3_prepare(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);
int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);
int sqlite3_prepare_v3(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);
int sqlite3_prepare16(
  sqlite3 *db,            /* Database handle */
  const void *zSql,       /* SQL statement, UTF-16 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const void **pzTail     /* OUT: Pointer to unused portion of zSql */
);
int sqlite3_prepare16_v2(
  sqlite3 *db,            /* Database handle */
  const void *zSql,       /* SQL statement, UTF-16 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const void **pzTail     /* OUT: Pointer to unused portion of zSql */
);
int sqlite3_prepare16_v3(
  sqlite3 *db,            /* Database handle */
  const void *zSql,       /* SQL statement, UTF-16 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const void **pzTail     /* OUT: Pointer to unused portion of zSql */
);

要執行 SQL 陳述式,必須先使用以下其中一個函式將其編譯成位元組碼程式。換句話說,這些函式是用於建構 已準備好的陳述式 (預編譯語句) 物件的建構子。

建議使用的函式是 sqlite3_prepare_v2()sqlite3_prepare() 介面是舊版函式,應避免使用。sqlite3_prepare_v3() 有一個額外的 "prepFlags" 選項,用於特殊用途。

建議使用 UTF-8 介面,因為 SQLite 目前使用 UTF-8 進行所有解析。提供 UTF-16 介面是為了方便起見。UTF-16 介面會將輸入文字轉換為 UTF-8,然後呼叫對應的 UTF-8 介面。

第一個參數 "db" 是先前成功呼叫 sqlite3_open()sqlite3_open_v2()sqlite3_open16() 所取得的 資料庫連線 (數據庫連接)。資料庫連線不得已關閉。

第二個參數 "zSql" 是要編譯的陳述式,以 UTF-8 或 UTF-16 編碼。sqlite3_prepare()、sqlite3_prepare_v2() 和 sqlite3_prepare_v3() 介面使用 UTF-8,而 sqlite3_prepare16()、sqlite3_prepare16_v2() 和 sqlite3_prepare16_v3() 使用 UTF-16。

如果 nByte 參數為負值,則 zSql 會讀取到第一個零終止符。如果 nByte 為正值,則它是從 zSql 讀取的位元組數。如果 nByte 為零,則不會產生已準備好的陳述式。如果呼叫者知道提供的字串是以 null 終止的,那麼傳遞一個包含 null 終止符的輸入字串位元組數的 nByte 參數會稍微提高效能。

如果 pzTail 不為 NULL,則 *pzTail 會指向 zSql 中第一個 SQL 陳述式結束後的下一個位元組。這些函式只會編譯 zSql 中的第一個陳述式,因此 *pzTail 會指向未編譯的剩餘部分。

*ppStmt 會指向一個已編譯的 已準備好的陳述式 (預編譯語句),可以使用 sqlite3_step() 執行它。如果發生錯誤,*ppStmt 會設定為 NULL。如果輸入文字不包含 SQL(如果輸入是空字串或註釋),則 *ppStmt 會設定為 NULL。呼叫程序負責在使用完已編譯的 SQL 陳述式後,使用 sqlite3_finalize() 將其刪除。ppStmt 不可為 NULL。

成功時,sqlite3_prepare() 系列函式會傳回 SQLITE_OK;否則會傳回 錯誤碼 (錯誤代碼)

建議所有新程式都使用 sqlite3_prepare_v2()、sqlite3_prepare_v3()、sqlite3_prepare16_v2() 和 sqlite3_prepare16_v3() 介面。保留舊版介面(sqlite3_prepare() 和 sqlite3_prepare16())是為了向後相容,但不建議使用它們。在 "vX" 介面中,傳回的已準備好的陳述式(sqlite3_stmt 物件)包含原始 SQL 文字的副本。這會導致 sqlite3_step() 介面的行為在三個方面有所不同

  1. 如果資料庫結構描述 (數據庫schema) 變更,sqlite3_step() 不會像以前那樣傳回 SQLITE_SCHEMA,而是會自動重新編譯 SQL 陳述式並嘗試再次執行它。在 sqlite3_step() 放棄並傳回錯誤之前,最多會重試 SQLITE_MAX_SCHEMA_RETRY 次。
  2. 當發生錯誤時,sqlite3_step() 會返回其中一個詳細的 錯誤碼擴展錯誤碼。舊有的行為是 sqlite3_step() 只會返回一個通用的 SQLITE_ERROR 結果碼,應用程式必須再次呼叫 sqlite3_reset() 才能找到問題的根本原因。使用「v2」準備介面,錯誤的根本原因會立即返回。
  3. 如果繫結到 WHERE 子句中 主機參數 的特定值可能會影響語句的查詢計劃選擇,則在任何更改該 參數繫結 之後的第一次 sqlite3_step() 呼叫時,語句將會自動重新編譯,如同綱要已變更一樣。如果參數是 LIKEGLOB 運算子的左邊,或者參數與已建立索引的欄位進行比較,並且啟用了編譯時期選項 SQLITE_ENABLE_STAT4,則 WHERE 子句 參數 的特定值可能會影響查詢計劃的選擇。

sqlite3_prepare_v3() 與 sqlite3_prepare_v2() 的不同之處僅在於它具有額外的 prepFlags 參數,該參數是一個由零個或多個 SQLITE_PREPARE_* 旗標組成的位元陣列。sqlite3_prepare_v2() 介面的運作方式與 prepFlags 參數為零的 sqlite3_prepare_v3() 完全相同。

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