SQLite學習筆記(7)

來源:互聯網
上載者:User

首先要注意控制代碼關聯。其次,開始看關於查詢參數化的內容。

查詢參數化:

         API支援在SQL語句中綁定參數,允許在後面為參數提供值,綁定的參數與sqlite3_prepare( ) 一起使用。如果沒有綁定參數,那麼sqlite3_step()預設使用null作為該參數的值。

         準備語句過後,將使用sqlite3_bind_xxx( ) 函數綁定參數值。

         函數的聲明:sqlite3_bind_xxx(

                                                                sqlite3_stmt * , /*語句控制代碼*/

                                                                 int  i,                  /*參數個數*/          

                                                                  xxx   value,       /*綁定的值*/

                                                              )  ;

       不同型別參數的綁定聲明:

                                  int   sqlite3_bind_xxx(sqlite3_stmt * ,  int  , xxx) ,其中xxx代表int 、double、int64、null、zeroblob 、blob、text、text16,其中前四個用於標量值,後三個用於數組。sqlite3_mprintf()函數自動轉移引號字元的功能在sqlite3_bind_text() 體現出。使用blob變種類型:

                                  int   sqlite3_bind_bolb(

                                                                           sqlite3_stmt  * ;     /* 語句控制代碼 */

                                                                           int  ,                          /*次序*/

                                                                          const  void * ,          /*指向blob資料*/

                                                                          int  n ,                        /**資料的位元組長度/

                                                                         void (*(void * ) ) ,     /*清除位元組程式*/

                                                                          ) ;

                                 API為清理控制代碼提供的兩個特殊含義的預定義值:

                                 #define    SQLITE_STATIC               ( (void (*)(void *))0 )          指示幫頂函數數組記憶體駐留在非託管空間,SQLite不會試圖清理該空間

                                 #define    SQLITE_TRANSIENT      ( (void (*)(void *))-1)          指示數組記憶體經常變化,SQLite需要自己的資料副本,副本在語句結束是自動清除

                                 清除函數:void  cleanup_fn( void *) .如果提供了自動清理函數,在語句結束時會自動調用。

         參數綁定完成,sqlite3_step()接受參數幫頂值,替換sql文本,執行語句。

         四種參數綁定辦法的不同:就是參數的表示方式(位置參數,顯式定義函數編號,字母數字化的數字名稱)、參數分配編號的方式。

                 參數編號:允許為參數指定編號,不使用內部給定的序列。參數編號的文法是問號後緊跟一個數字。

                                      比如:insert  into table_name values(?num,?num,?num……);其中num的值在1——999之間而且是越小越好,當num一樣,可以節省時間。    

                 參數命名:在指定參數編號的地方給參數綁定一個名稱。給參數編號的方法就是首碼為一個問號,表示命名的參數是在前面加上一個冒號(:)或者加上@符號。

                                      比如:insert into  table_name  values(:value, : value , @value);sqlite3_prepare()為命名的參數自動分配編號,雖然編號未知,但是可以使用函數sqlite3_bind_parameter_index( )獲得編號。

                 TCL參數:使用$符號。

錯誤與異常:

         錯誤處理:

              API可能返回錯誤的整數結果代碼。比如:sqlite3_open_v2() 、sqlite3_prepare()sqlite3_exec()、sqlite3_bind_xxx()、sqlite3_close() 、sqlite3_create_collation()、sqlite3_collation_needed()、sqlite3_create_function()、sqlite3_finalize()、sqlite3_sqlite3_get_table()、sqlite3_reset()
、sqlite3_step() 等。

               擷取錯誤的函數資訊函數:sqlite3_errmsg().

                        聲明:const   char * sqlite3_errmsg(sqlite3 *) ;   語句控制代碼是唯一參數,返回該連結上API調用產生的最近的錯誤,無錯誤才返回“not  an  error”.

                        SQLite 結果代碼:《SQLite權威指南》page195.

          繁忙情況處理:sqlite3_busy_handler() , sqlite3_busy_timeout( ).注意應急計劃的啟動,設定合理的逾時時間。

          模式改變處理:從鎖定的角度來看,模式改變的時間在sqlite3_prepare()調用和sqlite3_step()調用之間。應對的方法就是處理改變重新開始。導致SQLITE_SCHEMA存在的原因:分離資料庫、修改或者安裝使用者自訂的函數或者彙總、修改或者安裝使用者自訂的定序、修改或者安裝授權函數、清理資料庫空間等。這種錯誤情況與VDBE有關。

          追蹤SQL:使用函數sqlite3_trace( ) .

                   函式宣告:void   *sqlite3_trace(sqlite* ,   void(*xTrace)(void  * , const char *) , void * );和竊聽器的功能類似。

操作控制:

        基本都是監視資料庫的串連和事務的函數。

        提交鉤子:sqlite3_commit_hook()監視串連上的事務提交事件。

                聲明:  void  *  sqlite_commit_hook(

                                                                                sqlite * cnx ,  /*資料庫控制代碼*/

                                                                                int  (*xCallback )(void  * data) , /*回呼函數*/

                                                                                void  *data ,  /*應用程式資料*/

                                                                               );

         復原鉤子:sqlite3_rollback_hook()監視串連上的事務提交事件。

                聲明:  void  *  sqlite_rollback_hook(

                                                                                sqlite * cnx ,  /*資料庫控制代碼*/

                                                                                int  (*xCallback )(void  * data) , /*回呼函數*/

                                                                                void  *data ,  /*應用程式資料*/

                                                                               );

                 注意自動復原無法觸發回呼函數。

         更新鉤子:sqlite3_update_hook()監視串連上的事務提交事件。

                聲明:  void  *  sqlite_update_hook(

                                                                                sqlite * cnx ,  /*資料庫控制代碼*/

                                                                                int  (*xCallback )(void  * data) , /*回呼函數*/

                                                                                void  *data ,  /*應用程式資料*/

                                                                               );

                此時,回呼函數的行式:void callback(   void     * data,                              /*更新鉤子的第三個參數*/

                                                                                        int       operation_code,            /*與sqlite_update、sqlite_insert、sqlite_delete操作對應*/

                                                                                        char  const    *db_name,         

                                                                                        char  const    *table_name,

                                                                                        sqlite_int64     rowid,

                                                                                     );

授權函數:

          事件過濾器:sqlite3_set_authorizer()

                  聲明:    int   sqlite3_set_authorizer(

                                                                                  sqlite3  * ,

                                                                                  int  (*xAuth)(void  *,int , 

                                                                                                        const  char * , const  char * ,

                                                                                                        const  char * , const  char * ,

                                                                                                       )   ,

                                                                                   void  *pUserData;                                                                               

                                                                                  );

                注意:授權函數是存在回呼函數的:

                                   int  auth(

                                                  void *,   /*使用者資料*/

                                                  int,        /*事件代碼*/

                                                  const  char *,         /*事件具體相關的參數*/

                                                  const  char *,         /*事件具體相關的參數*/

                                                  const  char *,          /*資料庫名稱*/

                                                  const  char *,          /*觸發器或者視圖名稱*/

                                                 )

              授權函數的傳回值:SQLITE_OK、SQLITE_DENY(終止整個sql語句)、SQLITE_IGNORE。注意互動式程式的協助。page209。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.