sqlite使用小結2

F:\sqlite>type output.txt

hello world|10

goodbye cruel world|20

8、查看數據庫中所有的表

sqlite> .tables

my2ndtable  mytable

9、查看所有的表的創建語句

sqlite> .schema

CREATE TABLE my2ndtable(theonlyentry int);

CREATE TABLE mytable(entry1 varchar(10),entry2 int);

sqlite> .schema mytable

CREATE TABLE mytable(entry1 varchar(10),entry2 int);

10、數據庫導出和導入

我們可以利用這個功能做一個簡單的備份,或是說創建一個同樣的數據庫。

第一步,把數據庫倒出來:

cmd命令提示符下:

F:\sqlite>sqlite3 newsql.db ".dump" >a.sql

此語句將數據庫導出成a.sql數據庫語句文件,執行這個文件就可以創建一個一模一樣數據庫:

F:\sqlite>sqlite3 copied.db

SQLite version 3.6.23.1

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> select * from mytable;

hello world|10

goodbye cruel world|20

11、刪除記錄
delete from mytable where entry2=10;
可以刪掉mytable中所有entry2項爲10的條目。
注意:不是delete * from mytable,delete from mytable.沒有*.

 

三、SQLite3 C/C++ 開發接口簡介(API函數)

SQLite3SQLite一個全新的版本,它雖然是在SQLite 2.8.13的代碼基礎之上開發的,但是使用了和之前的版本不兼容的數據庫格式和API. SQLite3是爲了滿足以下的需求而開發的:

  • 支持UTF-16編碼.
  • 用戶自定義的文本排序方法.
  • 可以對BLOBs字段建立索引.

因此爲了支持這些特性我改變了數據庫的格式,建立了一個與之前版本不兼容的3.0. 至於其他的兼容性的改變,例如全新的API等等,都將在理論介紹之後向你說明,這樣可以使你最快的一次性擺脫兼容性問題.

3.0版的和2.X版的API非常相似,但是有一些重要的改變需要注意. 所有API接口函數和數據結構的前綴都由"sqlite_"改爲了"sqlite3_". 這是爲了避免同時使用SQLite 2.XSQLite 3.0這兩個版本的時候發生鏈接衝突.

由於對於C語言應該用什麼數據類型來存放UTF-16編碼的字符串並沒有一致的規範. 因此SQLite使用了普通的void* 類型來指向UTF-16編碼的字符串. 客戶端使用過程中可以把void*映射成適合他們的系統的任何數據類型.

SQLite 3.0一共有83API函數,此外還有一些數據結構和預定義(#defines). (完整的API介紹請參看另一份文檔.) 不過你們可以放心,這些接口使用起來不會像它的數量所暗示的那麼複雜. 最簡單的程序仍然使用三個函數就可以完成: sqlite3_open(), sqlite3_exec(), sqlite3_close(). 要是想更好的控制數據庫引擎的執行,可以使用提供的sqlite3_prepare()函數把SQL語句編譯成字節碼,然後在使用sqlite3_step()函數來執行編譯後的字節碼. sqlite3_column_開頭的一組API函數用來獲取查詢結果集中的信息. 許多接口函數都是成對出現的,同時有UTF-8UTF-16兩個版本. 並且提供了一組函數用來執行用戶自定義的SQL函數和文本排序函數.

2.1 如何打開關閉數據庫

   typedef struct sqlite3 sqlite3;
   int sqlite3_open(const char*, sqlite3**);
   int sqlite3_open16(const void*, sqlite3**);
   int sqlite3_close(sqlite3*);
   const char *sqlite3_errmsg(sqlite3*);
   const void *sqlite3_errmsg16(sqlite3*);
   int sqlite3_errcode(sqlite3*);

sqlite3_open() 函數返回一個整數錯誤代碼,而不是像第二版中一樣返回一個指向sqlite3結構體的指針. sqlite3_open() sqlite3_open16() 的不同之處在於sqlite3_open16() 使用UTF-16編碼(使用本地主機字節順序)傳遞數據庫文件名. 如果要創建新數據庫, sqlite3_open16() 將內部文本轉換爲UTF-16編碼, 反之sqlite3_open() 將文本轉換爲UTF-8編碼.

打開或者創建數據庫的命令會被緩存,直到這個數據庫真正被調用的時候纔會被執行. 而且允許使用PRAGMA聲明來設置如本地文本編碼或默認內存頁面大小等選項和參數.

sqlite3_errcode() 通常用來獲取最近調用的API接口返回的錯誤代碼. sqlite3_errmsg() 則用來得到這些錯誤代碼所對應的文字說明. 這些錯誤信息將以 UTF-8 的編碼返回,並且在下一次調用任何SQLite API函數的時候被清除. sqlite3_errmsg16() sqlite3_errmsg() 大體上相同,除了返回的錯誤信息將以 UTF-16 本機字節順序編碼.

SQLite3的錯誤代碼相比SQLite2沒有任何的改變,它們分別是:

#define SQLITE_OK           0   /* Successful result */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* An internal logic error in SQLite */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* (Internal Only) Table or record not found */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */
#define SQLITE_EMPTY       16   /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT  19   /* Abort due to contraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_ROW         100  /* sqlite_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite_step() has finished executing */

2.2 執行 SQL 語句

       typedef int (*sqlite_callback)(void*,int,char**, char**);
       int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);

sqlite3_exec 函數依然像它在SQLite2中一樣承擔着很多的工作. 該函數的第二個參數中可以編譯和執行零個或多個SQL語句. 查詢的結果返回給回調函數. 更多地信息可以查看API 參考.

SQLite3,sqlite3_exec一般是被準備SQL語句接口封裝起來使用的.

       typedef struct sqlite3_stmt sqlite3_stmt;
       int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);
       int sqlite3_prepare16(sqlite3*, const void*, int, sqlite3_stmt**, const void**);
       int sqlite3_finalize(sqlite3_stmt*);
       int sqlite3_reset(sqlite3_stmt*);

sqlite3_prepare 接口把一條SQL語句編譯成字節碼留給後面的執行函數. 使用該接口訪問數據庫是當前比較好的的一種方法.

sqlite3_prepare() 處理的SQL語句應該是UTF-8編碼的. sqlite3_prepare16() 則要求是UTF-16編碼的. 輸入的參數中只有第一個SQL語句會被編譯. 第四個參數則用來指向輸入參數中下一個需要編譯的SQL語句存放的SQLite statement對象的指針, 任何時候如果調用 sqlite3_finalize() 將銷燬一個準備好的SQL聲明. 在數據庫關閉之前,所有準備好的聲明都必須被釋放銷燬. sqlite3_reset() 函數用來重置一個SQL聲明的狀態,使得它可以被再次執行.

SQL聲明可以包含一些型如"?" "?nnn" ":aaa"的標記,其中"nnn" 是一個整數,"aaa" 是一個字符串. 這些標記代表一些不確定的字符值(或者說是通配符),可以在後面用sqlite3_bind 接口來填充這些值. 每一個通配符都被分配了一個編號(由它在SQL聲明中的位置決定,從1開始),此外也可以用 "nnn" 來表示 "?nnn" 這種情況. 允許相同的通配符在同一個SQL聲明中出現多次, 在這種情況下所有相同的通配符都會被替換成相同的值. 沒有被綁定的通配符將自動取NULL.

       int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
       int sqlite3_bind_double(sqlite3_stmt*, int, double);
       int sqlite3_bind_int(sqlite3_stmt*, int, int);
       int sqlite3_bind_int64(sqlite3_stmt*, int, long long int);
       int sqlite3_bind_null(sqlite3_stmt*, int);
       int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
       int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
       int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);

以上是 sqlite3_bind 所包含的全部接口,它們是用來給SQL聲明中的通配符賦值的. 沒有綁定的通配符則被認爲是空值. 綁定上的值不會被sqlite3_reset()函數重置. 但是在調用了sqlite3_reset()之後所有的通配符都可以被重新賦值.

SQL聲明準備好之後(其中綁定的步驟是可選的), 需要調用以下的方法來執行:

       int sqlite3_step(sqlite3_stmt*);

如果SQL返回了一個單行結果集,sqlite3_step() 函數將返回 SQLITE_ROW , 如果SQL語句執行成功或者正常將返回 SQLITE_DONE , 否則將返回錯誤代碼. 如果不能打開數據庫文件則會返回 SQLITE_BUSY . 如果函數的返回值是 SQLITE_ROW, 那麼下邊的這些方法可以用來獲得記錄集行中的數據:

       const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
       int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
       int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
       int sqlite3_column_count(sqlite3_stmt*);
       const char *sqlite3_column_decltype(sqlite3_stmt *, int iCol);
       const void *sqlite3_column_decltype16(sqlite3_stmt *, int iCol);
       double sqlite3_column_double(sqlite3_stmt*, int iCol);
       int sqlite3_column_int(sqlite3_stmt*, int iCol);
       long long int sqlite3_column_int64(sqlite3_stmt*, int iCol);
       const char *sqlite3_column_name(sqlite3_stmt*, int iCol);
       const void *sqlite3_column_name16(sqlite3_stmt*, int iCol);
       const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
       const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
       int sqlite3_column_type(sqlite3_stmt*, int iCol);

sqlite3_column_count()函數返回結果集中包含的列數. sqlite3_column_count() 可以在執行了 sqlite3_prepare()之後的任何時刻調用. sqlite3_data_count()除了必需要在sqlite3_step()之後調用之外,其他跟sqlite3_column_count() 大同小異. 如果調用sqlite3_step() 返回值是 SQLITE_DONE 或者一個錯誤代碼, 則此時調用sqlite3_data_count() 將返回 0 ,然而 sqlite3_column_count() 仍然會返回結果集中包含的列數.

返回的記錄集通過使用其它的幾個 sqlite3_column_***() 函數來提取, 所有的這些函數都把列的編號作爲第二個參數. 列編號從左到右以零起始. 請注意它和之前那些從1起始的參數的不同.

sqlite3_column_type()函數返回第N列的值的數據類型. 具體的返回值如下:

       #define SQLITE_INTEGER  1
       #define SQLITE_FLOAT    2
       #define SQLITE_TEXT     3
       #define SQLITE_BLOB     4
       #define SQLITE_NULL     5

sqlite3_column_decltype() 則用來返回該列在 CREATE TABLE 語句中聲明的類型. 它可以用在當返回類型是空字符串的時候. sqlite3_column_name() 返回第N列的字段名. sqlite3_column_bytes() 用來返回 UTF-8 編碼的BLOBs列的字節數或者TEXT字符串的字節數. sqlite3_column_bytes16() 對於BLOBs列返回同樣的結果,但是對於TEXT字符串則按 UTF-16 的編碼來計算字節數. sqlite3_column_blob() 返回 BLOB 數據. sqlite3_column_text() 返回 UTF-8 編碼的 TEXT 數據. sqlite3_column_text16() 返回 UTF-16 編碼的 TEXT 數據. sqlite3_column_int() 以本地主機的整數格式返回一個整數值. sqlite3_column_int64() 返回一個64位的整數. 最後, sqlite3_column_double() 返回浮點數.

不一定非要按照sqlite3_column_type()接口返回的數據類型來獲取數據. 數據類型不同時軟件將自動轉換.

2.3核心對象和接口

 

SQL數據庫引擎的最主要任務是解析SQL語句。爲了達成這個目的,開發者需要了解兩個對象:

 

* 數據庫連接對象:sqlite3

* 預處理語句對象:sqlite3_stmt

 

嚴格來講,預處理語句對象並不是必須的,因爲能夠使用sqlite_exec或者sqlite3_get_table這些便於使用的封裝接口,而這些接口封裝並隱藏了預處理語句對象。儘管如此,對預處理對象的理解有助於我們更充分的使用SQLite

 

數據庫連接對象和預處理對象是由下列的一組C/C++接口調用操縱的:

 

* sqlite3_open()

* sqlite3_prepare()

* sqlite3_step()

* sqlite3_column()

* sqlite3_finalize()

* sqlite3_close()

 

6C/C++接口例程和上述的兩個對象構成了SQLite的核心功能。開發者對於它們的理解能夠更好的使用SQLite

 

注意,這個接口例程列表更多是概念上的意義而不是實際的接口。許多這些接口都出現在各個版本之中。例如,上述列表中的sqlite3_open() 例程實際上有三個不同的接口以略微不同的方式實現相同的功能:slqite3_open()sqlite3_open16() sqlite3_open_v2()。列表中的實際上並不存在sqlite3_column()這個接口。顯示在列表中的 sqlite3_column()”僅僅是一個佔位,表示一整套用於從表中查詢出各種數據類型的列記錄接口。

 

這裏說明下核心接口的主要功能:

 

* sqlite3_open() 該接口打開與一個SQLite數據庫文件的連接並返回一個數據庫連接對象。這通常是應用程序調用的第一個SQLite API接口而且也是調用其他SQLite API接口前需要調用的接口。許多SQLite接口需要一個指向數據庫連接對象的指針作爲它們的第一個參數,因而這些接口也可以理解成是數據庫連接對象的操作接口。該接口就是創建了這樣一個數據庫連接對象。

 

* sqlite3_prepare() 該接口把一個SQL語句文本轉換成一個預處理語句對象並返回一個指向該對象的指針。這個接口需要一個由先前調用sqlite3_open()返回的數據庫連接對象指針以及一個預處理的SQL語句文本字符串爲參數。這個API並不實際解析SQL語句,僅僅是爲後續的解析而對SQL語句進行的預處理。

 

注意新的應用中不建議使用sqlite3_prepare(),而應該使用另一個接口sqlite3_prepare_v2()

 

* sqlite3_step() 該接口用於解析一個由先前通過sqlite3_prepare()接口創建的預處理語句,直至返回第一列結果爲止。通過再次調用 sqlite3_step()可以返回下一列的結果,繼續不斷地調用sqlite3_step()直至整個語句完成爲止。對於那些並不返回結果的語句(例如:INSERTUPDATEDELETE語句)一次調用sqlite3_step()就完成了語句的處理。

 

* sqlite3_column() 該接口返回一個由sqlite3_step()解析的預處理語句結果集中當前行的某一列數據。每次執行sqlite3_step()都返回一個新的結果集中的一行。可以多次調用sqlite3_column()接口返回那一行中所有列的數據。就像上面所說的那樣,SQLite API中並沒有sqlite3_column()這樣的接口。取而代之的是一組用於從結果集中查詢出各個列項各種數據類型數據的函數接口。在這組函數接口中,有些接口返回結果集的大小,有些返回結果集的列數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章