亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQLite > 正文

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

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

一、概述:

    在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). 當插入的數據量較大時,后者帶來的效率提升還是相當可觀的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲白虎美女被爆操| 国产精品视频免费在线观看| 黄色成人在线免费| 日韩欧美精品中文字幕| 国产精品青青在线观看爽香蕉| 国产区亚洲区欧美区| 午夜精品久久久久久久久久久久久| 国产精品成人久久久久| 亚洲精品狠狠操| 亚洲国产欧美在线成人app| 国内精品小视频在线观看| 久久久久久综合网天天| 欧美乱大交xxxxx| 亚洲男人天堂2024| 成人综合网网址| 国语自产在线不卡| 日韩一区二区三区国产| 久久综合久久美利坚合众国| 久久久久久高潮国产精品视| 在线电影av不卡网址| 最新日韩中文字幕| 91av视频在线免费观看| 国产亚洲精品久久久久久牛牛| 狠狠躁夜夜躁人人爽超碰91| 91高清视频在线免费观看| 永久555www成人免费| 久久精品国产欧美激情| 91精品国产91久久久久久| 97久久精品人人澡人人爽缅北| 亚洲无av在线中文字幕| 7777精品视频| 国产中文字幕亚洲| 日韩亚洲综合在线| 日韩在线免费高清视频| 亚洲二区在线播放视频| 国产精品视频播放| 日韩av综合网| 国产成人极品视频| 久久久国产精品x99av| 亚洲男人天堂2019| 91精品国产色综合久久不卡98口| 国内精品小视频在线观看| 丰满岳妇乱一区二区三区| 日本成人黄色片| 亚洲人成电影网站色xx| 欧美最顶级的aⅴ艳星| 欧美一级片久久久久久久| 国产一区二区黑人欧美xxxx| 亚洲自拍偷拍色图| 久久99久久99精品免观看粉嫩| 亚洲天堂av网| 亚洲有声小说3d| 午夜精品久久久久久久久久久久久| 亚洲午夜未删减在线观看| 国产精品人成电影在线观看| 国产精品美女免费看| 国产丝袜精品视频| 日韩在线精品一区| 91精品国产高清久久久久久91| 精品成人乱色一区二区| 久久在精品线影院精品国产| 国产精品视频久久| 欧美成人免费在线视频| 国产不卡精品视男人的天堂| 亚洲国产精品小视频| 丰满岳妇乱一区二区三区| 成人免费福利在线| 国产精品美女网站| 亚洲国产精久久久久久久| 国产精品视频一区二区高潮| 中文字幕欧美在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品九九久久久久久久| 在线播放国产一区中文字幕剧情欧美| 亚洲人成电影网| 亚洲欧洲国产一区| 在线日韩欧美视频| 亚洲精品一区中文| 亚洲精品网站在线播放gif| 色午夜这里只有精品| 日本一欧美一欧美一亚洲视频| 国产精品视频精品| 日韩在线视频网| 亚洲精品456在线播放狼人| 性欧美暴力猛交69hd| 久久久久久中文| 91九色视频导航| 亚洲国产精久久久久久久| 国产日韩欧美一二三区| 97超级碰碰碰| 亚洲一级片在线看| 伊人久久久久久久久久久| 午夜精品蜜臀一区二区三区免费| 欧美国产精品日韩| 国产精品久久久久久久久久三级| 亚洲精品一区av在线播放| 国产成人精彩在线视频九色| 欧美日韩国产123| 91免费欧美精品| 成人乱色短篇合集| 国产国产精品人在线视| 久久免费精品日本久久中文字幕| 色爱精品视频一区| 中文字幕欧美专区| 日韩av在线免费观看| 亚洲欧美日韩精品久久亚洲区| 精品久久久久久国产91| 精品国产区一区二区三区在线观看| 日本成人黄色片| 91影视免费在线观看| 久久综合伊人77777尤物| 久久国产精品久久久久久| 日韩av中文在线| 日韩综合视频在线观看| 国产精品一二三在线| 不卡av在线网站| 久久99国产精品自在自在app| 日韩精品在线观看一区| 欧美在线中文字幕| 日本道色综合久久影院| 亚洲视频在线观看| 亚洲成人网在线观看| 97视频在线观看免费| 国产亚洲精品久久久久久| 亚洲精品wwwww| 欧美成人在线免费视频| 日韩极品精品视频免费观看| 91精品国产乱码久久久久久久久| 国产在线精品播放| 国产一区二区三区网站| 欧美高清视频在线观看| 国产精品偷伦视频免费观看国产| 成人在线中文字幕| 午夜剧场成人观在线视频免费观看| 欧美精品久久久久a| 日韩精品免费一线在线观看| 国产香蕉精品视频一区二区三区| 久久色精品视频| 一区二区三区国产视频| 国产精品视频精品| 精品欧美激情精品一区| 国模吧一区二区| 国产成人精品电影久久久| 中文在线不卡视频| 日韩欧美视频一区二区三区| 国产做受69高潮| 日韩亚洲在线观看| 国产精品91免费在线| 日韩av在线免费播放| 日韩在线播放一区| 亚洲a在线观看| 欧日韩在线观看| 久久久久久欧美| 欧美成人在线网站| 亚洲人免费视频| 国产精品久久久久久久久久三级| 96精品视频在线| 精品国产欧美成人夜夜嗨| 一二美女精品欧洲| 最新91在线视频| 91在线精品播放| 国产91|九色| 国产精品日韩久久久久| 亚洲视频在线观看免费|