麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > SQLite > 正文

SQLite教程(二):C/C++接口簡介

2020-01-25 19:29:23
字體:
來源:轉載
供稿:網(wǎng)友
這篇文章主要介紹了SQLite教程(二):C/C++接口簡介,本文講解了C/C++接口概述、核心對象和接口、參數(shù)綁定等內容,需要的朋友可以參考下
 

一、概述:

    在SQLite提供的C/C++接口中,其中5個APIs屬于核心接口。在這篇博客中我們將主要介紹它們的用法,以及它們所涉及到的核心SQLite對象,如database_connection和prepared_statement。相比于其它數(shù)據(jù)庫引擎提供的APIs,如OCI、MySQL API等,SQLite提供的接口還是非常易于理解和掌握的。
    
二、核心對象和接口:

    1. 核心對象:
    在SQLite中最主要的兩個對象是,database_connection和prepared_statement。database_connection對象是由sqlite3_open()接口函數(shù)創(chuàng)建并返回的,在應用程序使用任何其他SQLite接口函數(shù)之前,必須先調用該函數(shù)以便獲得database_connnection對象,在隨后的其他APIs調用中,都需要該對象作為輸入?yún)?shù)以完成相應的工作。至于prepare_statement,我們可以簡單的將它視為編譯后的SQL語句,因此,所有和SQL語句執(zhí)行相關的函數(shù)也都需要該對象作為輸入?yún)?shù)以完成指定的SQL操作。
    
    2. 核心接口:
    1). sqlite3_open
    上面已經(jīng)提到過這個函數(shù)了,它是操作SQLite數(shù)據(jù)庫的入口函數(shù)。該函數(shù)返回的database_connection對象是很多其他SQLite APIs的句柄參數(shù)。注意,我們通過該函數(shù)既可以打開已經(jīng)存在的數(shù)據(jù)庫文件,也可以創(chuàng)建新的數(shù)據(jù)庫文件。對于該函數(shù)返回的database_connection對象,我們可以在多個線程之間共享該對象的指針,以便完成和數(shù)據(jù)庫相關的任意操作。然而在多線程情況下,我們更為推薦的使用方式是,為每個線程創(chuàng)建獨立的database_connection對象。對于該函數(shù)還有一點也需要額外說明,我們沒有必要為了訪問多個數(shù)據(jù)庫而創(chuàng)建多個數(shù)據(jù)庫連接對象,因為通過SQLite自帶的ATTACH命令可以在一個連接中方便的訪問多個數(shù)據(jù)庫。
        
    2). sqlite3_prepare
    該函數(shù)將SQL文本轉換為prepared_statement對象,并在函數(shù)執(zhí)行后返回該對象的指針。事實上,該函數(shù)并不會評估參數(shù)指定SQL語句,它僅僅是將SQL文本初始化為待執(zhí)行的狀態(tài)。最后需要指出的,對于新的應用程序我們可以使用sqlite3_prepare_v2接口函數(shù)來替代該函數(shù)以完成相同的工作。
    
    3). sqlite3_step
    該函數(shù)用于評估sqlite3_prepare函數(shù)返回的prepared_statement對象,在執(zhí)行完該函數(shù)之后,prepared_statement對象的內部指針將指向其返回的結果集的第一行。如果打算進一步迭代其后的數(shù)據(jù)行,就需要不斷的調用該函數(shù),直到所有的數(shù)據(jù)行都遍歷完畢。然而對于INSERT、UPDATE和DELETE等DML語句,該函數(shù)執(zhí)行一次即可完成。
    
    4). sqlite3_column
    該函數(shù)用于獲取當前行指定列的數(shù)據(jù),然而嚴格意義上講,此函數(shù)在SQLite的接口函數(shù)中并不存在,而是由一組相關的接口函數(shù)來完成該功能,其中每個函數(shù)都返回不同類型的數(shù)據(jù),如:
 

復制代碼代碼如下:

    sqlite3_column_blob
    sqlite3_column_bytes
    sqlite3_column_bytes16
    sqlite3_column_double
    sqlite3_column_int
    sqlite3_column_int64
    sqlite3_column_text
    sqlite3_column_text16
    sqlite3_column_type
    sqlite3_column_value
    sqlite3_column_count
 

    其中sqlite3_column_count函數(shù)用于獲取當前結果集中的字段數(shù)據(jù)。下面是使用sqlite3_step和sqlite3_column函數(shù)迭代結果集中每行數(shù)據(jù)的偽代碼,注意這里作為示例代碼簡化了對字段類型的判斷:
復制代碼代碼如下:

     int fieldCount = sqlite3_column_count(...);
     while (sqlite3_step(...) <> EOF) {
         for (int i = 0; i < fieldCount; ++i) {
             int v = sqlite3_column_int(...,i);
         }
     }

    5). sqlite3_finalize
    該函數(shù)用于銷毀prepared statement對象,否則將會造成內存泄露。
    
    6). sqlite3_close
    該函數(shù)用于關閉之前打開的database_connection對象,其中所有和該對象相關的prepared_statements對象都必須在此之前先被銷毀。

 

三、參數(shù)綁定:

    和大多數(shù)關系型數(shù)據(jù)庫一樣,SQLite的SQL文本也支持變量綁定,以便減少SQL語句被動態(tài)解析的次數(shù),從而提高數(shù)據(jù)查詢和數(shù)據(jù)操作的效率。要完成該操作,我們需要使用SQLite提供的另外兩個接口APIs,sqlite3_reset和sqlite3_bind。見如下示例:

 

復制代碼代碼如下:

void test_parameter_binding() {
        //1. 不帶參數(shù)綁定的情況下插入多條數(shù)據(jù)。
        char strSQL[128];
        for (int i = 0; i < MAX_ROWS; ++i) {
            sprintf(strSQL,"insert into testtable values(%d)",i);
            sqlite3_prepare_v2(..., strSQL);
            sqlite3_step(prepared_stmt);
            sqlite3_finalize(prepared_stmt);
        }
        //2. 參數(shù)綁定的情況下插入多條數(shù)據(jù)。
        string strSQLWithParameter = "insert into testtable values(?)";
        sqlite3_prepare_v2(..., strSQL);
        for (int i = 0; i < MAX_ROWS; ++i) {
            sqlite3_bind(...,i);
            sqlite3_step(prepared_stmt);
            sqlite3_reset(prepared_stmt);
        }
        sqlite3_finalize(prepared_stmt);
    }

 

這里首先需要說明的是,SQL語句"insert into testtable values(?)"中的問號(?)表示參數(shù)變量的占位符,該規(guī)則在很多關系型數(shù)據(jù)庫中都是一致的,因此這對于數(shù)據(jù)庫移植操作還是比較方便的。

    通過上面的示例代碼可以顯而易見的看出,參數(shù)綁定寫法的執(zhí)行效率要高于每次生成不同的SQL語句的寫法,即2)在效率上要明顯優(yōu)于1),下面是針對這兩種寫法的具體比較:

    1). 單單從程序表面來看,前者在for循環(huán)中執(zhí)行了更多的任務,比如字符串的填充、SQL語句的prepare,以及prepared_statement對象的釋放。
    2). 在SQLite的官方文檔中明確的指出,sqlite3_prepare_v2的執(zhí)行效率往往要低于sqlite3_step的效率。
    3). 當插入的數(shù)據(jù)量較大時,后者帶來的效率提升還是相當可觀的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄色片视频免费观看 | 在线观看国产一区二区 | 91九色视频观看 | 中文字幕一区久久 | 一本色道久久综合狠狠躁篇适合什么人看 | 欧美一级做一级爱a做片性 久久久资源网 | 国产精品爱久久久久久久 | 极品美女一级毛片 | 久久老司机精品视频 | 国产成人自拍视频在线 | 手机av在线电影 | 国产精品免费久久久久 | 国产91在线高潮白浆在线观看 | 成码无人av片在线观看网站 | 日日草日日干 | 精品中文字幕视频 | 精品人伦一区二区三区蜜桃网站 | 99热久草| 国产一精品久久99无吗一高潮 | 毛片在线播放视频 | 91av网址| 欧美成人精品一区 | www.91成人| 青青国产在线视频 | 性欧美视频在线观看 | 国产韩国精品一区二区三区久久 | 久久最新网址 | 视频www| 亚洲国产超高清a毛毛片 | 精品国产一区二区亚洲人成毛片 | 中文字幕欧美一区二区三区 | 午夜影院a| 欧美巨根 | 97人操 | 天堂在线中文资源 | 国产91成人 | 2019中文字幕在线播放 | freexxxhd喷水| av成人在线免费观看 | 亚洲成a人在线 | 好吊色欧美一区二区三区四区 |