国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sqlite - SQLite教程(二):C/C++接口簡介

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

2020-06-08 17:52hdbird Sqlite

這篇文章主要介紹了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). 當插入的數據量較大時,后者帶來的效率提升還是相當可觀的。

延伸 · 閱讀

精彩推薦
  • SqliteSQLite中的WAL機制詳細介紹

    SQLite中的WAL機制詳細介紹

    這篇文章主要介紹了SQLite中的WAL機制詳細介紹,本文講解了什么是WAL、WAL如何工作、WAL的優點與缺點、WAL引入的兼容性問題、WAL引入的性能問題等內容,需要...

    dodo83402020-06-08
  • Sqlite詳解SQLite中的查詢規劃器

    詳解SQLite中的查詢規劃器

    這篇文章主要介紹了詳解SQLite中的查詢規劃器,SQLite是一個開源的嵌入式數據庫,需要的朋友可以參考下...

    SQLite教程網8892021-10-25
  • SqliteSQLite中重置自動編號列的方法

    SQLite中重置自動編號列的方法

    這篇文章主要介紹了SQLite中重置自動編號列的方法,本文講解了3種情況和其對應解決方法,需要的朋友可以參考下 ...

    dodo84492020-06-08
  • SqliteSQLite 錯誤碼整理

    SQLite 錯誤碼整理

    這篇文章主要介紹了SQLite 錯誤碼,方便大家在開發過程中快速解決問題 ...

    SQLite教程網5532020-06-06
  • Sqlite基于sqlite特殊字符轉義的實現方法

    基于sqlite特殊字符轉義的實現方法

    本篇文章是對sqlite特殊字符轉義的實現方法進行了詳細的分析介紹,需要的朋友參考下 ...

    sqlite數據庫教程網4132020-06-04
  • SqliteSQLite速度評測代碼

    SQLite速度評測代碼

    SQLite 作為一個輕量級嵌入式數據庫,還是非常好用的。雨痕極力推薦~~~~~~ ...

    SQLite教程網5832020-06-01
  • SqliteSQLite 內存數據庫學習手冊

    SQLite 內存數據庫學習手冊

    這篇文章主要介紹SQLite 內存數據庫的使用方法, 需要的朋友可以參考下 ...

    SQLite教程網3292020-06-06
  • SqliteSQLite 入門教程三 好多約束 Constraints

    SQLite 入門教程三 好多約束 Constraints

    在上一篇隨筆的結尾,我提到了SQLite的約束, 但是在那里我把它翻譯成了限定符,不太準確,這里先更正一下,應該翻譯成約束更貼切一點。 那么什么是...

    SQLite入門教程4572020-06-05
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 九九综合九九 | 欧美日韩国产高清 | 视频一二区 | 亚洲精品a| 久久综合久久久 | 一级一片在线播放在线观看 | 色九九| 一区高清| 国产资源在线观看视频 | 五月天一区二区 | 亚洲视频区 | 亚洲精品久久久久久久久久久久久 | 国产欧美一区二区精品性色 | 国产一区日韩精品 | 亚洲国产视频一区 | 亚洲午夜精品一区二区三区 | 亚洲国产精品久久人人爱 | 精品一区二区久久久久久久网站 | 欧美日韩一区二区视频在线观看 | 精品一区二区av | www伊人 | 久久精品综合 | 午夜影院在线观看 | 亚洲精品久久久久久久久久久久久 | 久久成人国产精品 | 岛国av免费 | 大胆一区 | 五月婷婷丁香 | 亚洲电影在线播放 | 69久久| 亚洲精品专区 | 亚洲成人精品一区 | 国产精品成人一区二区 | 精品国产精品 | 午夜天 | 欧美精品一区二区三区四区 | 日韩高清在线一区 | 国产精品一区二区三区在线播放 | 三级视频在线 | 日本中文字幕网 | 欧美精品1 |