成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:506日期:2023-04-05 14:56:03

一、概述:

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

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

三、參數綁定:

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

復制代碼 代碼如下:
void test_parameter_binding() {
        //1. 不帶參數綁定的情況下插入多條數據。
        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. 參數綁定的情況下插入多條數據。
        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(?)"中的問號(?)表示參數變量的占位符,該規則在很多關系型數據庫中都是一致的,因此這對于數據庫移植操作還是比較方便的。

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

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

標簽: SQLite
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
免费观看30秒视频久久| youjizz久久| 宅男噜噜噜66一区二区66| 黄色欧美日韩| 久久精工是国产品牌吗| 国产精品亲子乱子伦xxxx裸| 欧美日韩一区小说| 亚洲精品欧洲| 国产精品夜夜爽| 亚洲综合图片区| 久久精品亚洲麻豆av一区二区 | 色婷婷精品久久二区二区蜜臀av | 香蕉久久国产| 女生裸体视频一区二区三区| 精品在线播放午夜| 亚洲综合激情另类小说区| 久久久一区二区| 欧美人牲a欧美精品| 国产亚洲欧美一区二区| 欧美精品成人| 粉嫩在线一区二区三区视频| 日韩精品电影一区亚洲| 国产精品美女久久久久久久| 91精品国产麻豆| 色老头久久综合| 99视频一区| 欧美暴力喷水在线| 国产精品性做久久久久久| 香蕉影视欧美成人| 亚洲另类在线一区| 国产视频一区二区在线观看| 日韩一级免费一区| 日本电影亚洲天堂一区| 国产伦精品一区二区| 国产一区日韩一区| 99久久伊人网影院| 韩国欧美国产一区| 日韩福利电影在线| 一区二区三区国产| 国产精品久久久久久户外露出| 精品日韩一区二区三区| 欧美精品1区2区3区| 色妹子一区二区| 中文在线一区| 好吊色欧美一区二区三区视频| 99久久精品免费看| 成人午夜免费av| 国产精品一区二区你懂的| 美日韩一级片在线观看| 午夜精品福利在线| 亚洲五码中文字幕| 亚洲人午夜精品天堂一二香蕉| 国产亚洲va综合人人澡精品 | 日韩国产一二三区| 亚洲影视资源网| 亚洲欧美一区二区在线观看| 久久久国产精华| 久久久高清一区二区三区| 精品久久久三级丝袜| 欧美第一区第二区| 精品毛片乱码1区2区3区| 日韩视频一区二区三区在线播放| 91麻豆精品国产91久久久使用方法| 欧美日韩一区二区三区免费看 | 日韩av电影免费观看高清完整版在线观看| 亚洲综合免费观看高清完整版| 综合激情成人伊人| 国产精品超碰97尤物18| 欧美国产精品一区| 欧美极品另类videosde| 国产亚洲精品精华液| 国产三级欧美三级日产三级99| 欧美精品一区二区三区蜜臀| 日韩精品中文字幕一区二区三区| 日韩丝袜情趣美女图片| 欧美成人官网二区| 亚洲精品一区二区三区影院| 欧美成人精品二区三区99精品| 欧美成人艳星乳罩| 久久亚洲综合色一区二区三区 | 欧美sm重口味系列视频在线观看| 亚洲欧美文学| 欧美日韩一区在线观看视频| 欧美午夜电影在线观看 | 欧美亚洲动漫另类| 欧美亚州韩日在线看免费版国语版| 欧美性大战久久久久久久蜜臀 | 99精品国产99久久久久久白柏| 成人国产精品视频| 91网站在线观看视频| 欧美成人嫩草网站| 欧美精品国产一区| 伊人成人在线| 国产精品一区二区欧美| 色悠悠亚洲一区二区| 欧美伊人久久久久久久久影院| 欧美日韩激情一区二区| 日韩午夜在线观看| 国产亚洲1区2区3区| 一区视频在线播放| 亚洲高清不卡在线观看| 日本最新不卡在线| 韩国女主播一区| 99视频精品在线| 欧美激情综合| 国产一区二区三区成人欧美日韩在线观看 | 成人av第一页| 午夜国产精品视频| 亚洲日本无吗高清不卡| 国产九九精品| 欧美三级日韩在线| 日韩一区二区三| 国产亚洲精久久久久久| 亚洲乱码国产乱码精品精98午夜 | 亚洲日本免费| 久久久久高清| 在线成人av网站| 久久嫩草精品久久久精品一| 亚洲天堂精品在线观看| 亚洲大型综合色站| 韩国理伦片一区二区三区在线播放| www.欧美精品一二区| 欧美日韩亚洲一区二区三区在线 | 欧美在线免费视屏| 日韩欧美国产一区二区三区| 国产欧美日本一区视频| 一区二区久久久久久| 精品一区二区在线观看| 91丝袜美女网| 国产欧美短视频| 欧美视频自拍偷拍| 欧美sm极限捆绑bd| 亚洲免费资源在线播放| 免费在线观看成人| 成人手机电影网| 亚洲国产导航| 欧美性感一类影片在线播放| 精品动漫一区二区三区在线观看| 最新国产成人在线观看| 青青草国产成人av片免费| youjizz久久| 国产伦精品一区二区三| 欧美久久一二区| 中文字幕国产一区二区| 视频一区二区三区入口| 国产精品99久久久久| 亚洲视频免费| 欧美最猛性xxxxx直播| 久久久久久黄色| 五月天亚洲婷婷| 成人激情图片网| 91久久在线| 欧美日本视频在线| 国产精品美女久久久久久2018| 日韩精品久久理论片| 99免费精品在线| 久久久久看片| 国产视频一区二区三区在线观看 | 亚洲欧美日韩视频二区| 91精品在线免费观看| 中文字幕亚洲在| 国产在线看一区| 精品69视频一区二区三区Q| 在线观看日韩毛片| 欧美韩国一区二区| 免费不卡在线视频| 黄色精品一区| 欧美挠脚心视频网站| 亚洲素人一区二区| 国产成人在线观看| 亚洲欧美日韩国产综合精品二区| 精品粉嫩aⅴ一区二区三区四区| 亚洲gay无套男同| 91小视频在线免费看| 在线观看日韩毛片| 中文字幕日韩一区二区| 国产一本一道久久香蕉| 一区二区三区视频在线播放| 91精品国产综合久久久久久| 亚洲综合区在线| 91免费国产在线| 欧美色综合久久| 亚洲欧美国产77777| gogogo免费视频观看亚洲一| 日本韩国精品在线| 亚洲三级在线看| 99免费精品在线观看| 欧美午夜免费电影| ㊣最新国产の精品bt伙计久久| 国产成人在线观看| 色综合久久久久综合体桃花网| 欧美国产1区2区| 国产精品一区二区三区网站| 免费看的黄色欧美网站| 国产视频一区在线观看| 国产一区二区三区在线观看精品| 免费久久99精品国产自| 国产精品嫩草久久久久| 国产成人午夜99999| 久久一区免费|