Sqlite3

Sqlite3初學
Sqlite3是一個很是靈活的數據庫系統,沒有數據庫服務器的概念,這應該算是迴歸了比較傳統的數據庫設計。
早期咱們的數據都是直接存放在文件系統,因爲簡單的文件系統存在數據冗餘、不一致、讀取操做繁瑣(每一個數據結構均可能要編寫本身的讀寫程序)等,慢慢造成了數據庫管理系統,一套完整的數據庫理論。
目前較爲流行的Oracle, SqlServer, MySql等數據庫系統均是服務器-客戶端的概念,數據庫服務器負責全部的數據管理、權限管理等,客戶端按照必定格式發出請求便可。
sql則是較爲流行的結構化查詢語言,爲衆多上層應用提供簡單方便的數據庫讀寫操做等。
可是可想而知,服務器端一定是須要對sql請求進行解析而後執行的,那麼這些執行程序還得迴歸更底層的語言,好比C&C++的實現。
注意:(第1代語言 機器語言(指令系統)其指令爲二進制代碼(0、1),直接對應芯片上的運算了
 第2代語言 彙編語言 用「助記符」代替二進制代碼,如用ADD  A,B表示兩數相加。
 第3代語言 高級語言(面向過程)例如:C、JAVA、C++。
 第4代語言(非過程化語言)    例如:SQL語言。
 第5代語言(智能化語言)    例如:Prolog語言)
 
 而sqlite3從功能上來講,這是一個數據庫系統,其本質上是由一套用C語言實現的對數據庫文件的讀寫接口。此類接口支持sql語言。因此,這不須要什麼服務器,也沒有數據庫權限管理。在程序中能夠隨時調用API建立一個數據庫文件,進行數據存儲,很是靈活易用。
 
 下面簡單羅列其使用舉例:
1,打開或建立數據庫文件
 sqlite3 *mDb; //數據庫句柄
 int ret = sqlite3_open_v2(fileName, &mDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); 
    if(ret != SQLITE_OK)
    {
        sqlite3_close(mDb);
    }
2,建立一個sql語句
由數據庫句柄建立一個sql語句句柄
sqlite3_stmt *SqlDb::prepare(const char *sqlText)
{
 sqlite3_stmt *stmt = NULL;
 const char *tail = NULL;
 sqlite3_prepare_v2(mDb, sqlText, -1, &stmt, &tail);
 return stmt;
}
3,執行sql語句
 sqlite3_stmt *stmt;
 int ret = sqlite3_step(stmt);
 若是是update, delete, insert等語句,正常應該返回 SQLITE_DONE ;若是是select語句,且有還有記錄,則應該返回SQLITE_ROW;
4,如何對sql語句綁定參數值
    在ado.net中,通常能夠經過存儲過程當中的變量值綁定。
 在這裏的寫法是 insert ... values(?, ?)其中?表示綁定的參數
  sqlite3_bind_int(sqlite3_stmt*, int index, int value); 表示將value綁定給第index個參數
  還能夠綁定double,text,blob等。
  sqlite3_bind_int64(sqlite3_stmt*, int index, int64 value);
  sqlite3_bind_double(sqlite3_stmt*, int index, double value);
  sqlite3_bind_text(sqlite3_stmt*, int index, const char* value, size, SQLITE_TRANSIENT); //最後一個參數好像是表示是否須要拷貝一份,這裏的value是一個指針,防止其指向的對象被修改。
  sqlite3_bind_blob(sqlite3_stmt*, int index, const void* value, size, SQLITE_TRANSIENT);
  正常返回SQLITE_OK。
5如何取得sql語句執行結果
     與綁定比較相似,
 int value = sqlite3_column_int(sqlite3_stmt*, int index);
 int64 value = sqlite3_column_int64(sqlite3_stmt*, int index);
 double value = sqlite3_column_double(sqlite3_stmt*, int index);sql

 const uchar **value, int *size
 *value = sqlite3_column_text(sqlite3_stmt*,  int index);
 *size = sqlite3_column_bytes(sqlite3_stmt*,  int index);數據庫

 *value = sqlite3_column_blob(sqlite3_stmt*,  int index);
 *size = sqlite3_column_bytes(sqlite3_stmt*,  int index);
 注意text,blob返回的是一個指針,該指針指向的內容應該是sqlite3_stmt本身維護的內存中,那麼這部分數據何時釋放呢??我猜測應該是在調用如下語句時:
 sqlite3_finalize(sqlite3_stmt*); //注意,咱們執行完一個sql語句後,應該及時調用該語句。
6,關閉數據庫
 sqlite3_close(sqlite3 *);服務器

相關文章
相關標籤/搜索