【正文】
SQLite的主要優(yōu)勢在于靈巧、快速和可靠性高。 可以充分利用SQLite提供SQL特征,完成簡單的數(shù)據(jù)統(tǒng)計分析的功能。5. 產品Demo和測試: 四、個性化特征:在使用的過程中,也無需創(chuàng)建用戶和劃分權限。2. 沒有獨立的服務器:SQLite的數(shù)據(jù)庫被存放在文件系統(tǒng)的單一磁盤文件內,只要有權限便可隨意訪問和拷貝,這樣帶來的主要好處是便于攜帶和共享。然而這只是該操作的一小部分,因為數(shù)據(jù)導入往往需要更多的時間。 4. 生成或下載 SQLite3 Shell 文件:關于這 SQLite3 的 Shell 文件呢,就是用來創(chuàng)建 SQLite3 數(shù)據(jù)庫啊,創(chuàng)建表啊之類的東西,說白了就是個 SQLite Admin 的控制臺界面,當然咯,控制臺這個東西并不怎么好用,所以你可以考慮換個其他的帶 GUI 的工具來管理你的 SQLite3 數(shù)據(jù)庫。,是因為VC\Bin\下沒有“,”這四個文件,解決的方法:1 直接從Common7\IDE\下復制這四個文件到VC\Bin\下即可解決2 添加系統(tǒng)變量(Path),這樣:我的電腦屬性高級環(huán)境變量系統(tǒng)變量,在path中添加C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;,注意結尾最后用“;”隔開!。這里需要說明的是,對于自定義數(shù)據(jù)表表名,如testtable,不能以sqlite_開頭,因為以該前綴定義的表名都用于sqlite內部。sqlite)。ATTACH DATABASE 關于該規(guī)則還需要給出一些額外的說明,如果我們在創(chuàng)建數(shù)據(jù)表時沒有指定數(shù)據(jù)庫名,那么將會在當前連接的main數(shù)據(jù)庫中創(chuàng)建該表,在一個連接中只能有一個main數(shù)據(jù)庫。sqlitetesttable (first_col integer)。sqlitesqlite 然而如果在創(chuàng)建表時加上IF NOT EXISTS從句,那么本次創(chuàng)建操作將不會有任何影響,即不會有錯誤拋出,除非當前的表名和某一索引名沖突。FROMsqlite sqlite 和其他關系型數(shù)據(jù)庫一樣,主鍵必須是唯一的。testtable2 ( sqlite SELECT count(*) FROM testtable。 CHECK sqlite ...AND CREATE TABLE testtable (first_col integer, second_col integer)。表testtable的定義中已經包含了新增字段。關于ALTER TABLE最后需要說明的是,在SQLite中該命令的執(zhí)行時間是不會受到當前表行數(shù)的影響,也就是說,修改有一千萬行數(shù)據(jù)的表和修改只有一條數(shù)據(jù)的表所需的時間幾乎是相等的。sqlite CREATE TABLE testtable (first_col integer)。Error: no such table: testtable AStempview SELECT * FROM testtable WHERE first_col 100。CREATE VIEW IF NOT EXISTSsqlite mit命令提交所執(zhí)行的所有操作。 SQLite采用粗粒度的鎖。默認情況下,一切都從未鎖定(unlocked)開始。)(39。代碼的鎖路徑如下所示:UNLOCKEDPENDINGSHAREDUNLOCKED這樣的做法,你可能會發(fā)現(xiàn),可以在兩個select exec()調用之間插入修改數(shù)據(jù)庫的操作,因此,這樣做無法確保兩個命令返回相同的結果。如果它獲得保留鎖,則準備好開始進行數(shù)據(jù)修改。當連接進入保留狀態(tài)時,pager初始化回滾日志。未修改頁是Btree讀取但并未改變的頁,它們是諸如select命令之類的結果。比如此處說的情況,事務自動提交,然后pager清理日志,清除頁緩存,從獨占鎖回到未鎖定狀態(tài)。3). 刪除測試表。 sqlite3_stmt* stmt = NULL。對于DDL和DML語句而言,sqlite3_step執(zhí)行正確的返回值 //只有SQLITE_DONE,對于SELECT查詢而言,如果有數(shù)據(jù)返回SQLITE_ROW,當?shù)竭_結果集末尾時則返回 //SQLITE_DONE。 //5. 構建插入數(shù)據(jù)的sqlite3_stmt對象。 i insertCount。 return。 sqlite3_close(conn)。事實上,批量插入并不是什么新的概念,在其它關系型數(shù)據(jù)庫的C接口API中都提供了一定的支持,只是接口的實現(xiàn)方式不同而已。顯而易見,這樣的批量寫入方式在效率上勢必會遠遠優(yōu)于多迭代式的單次寫入操作。 } const char* createTableSQL = CREATE TABLE TESTTABLE (int_col INT, float_col REAL, string_col TEXT)。 } //3. 通過sqlite3_step命令執(zhí)行創(chuàng)建表的語句。 //5. 顯式的開啟一個事物。 sqlite3_close(conn)。 sqlite3_close(conn)。 sqlite3_bind_double(stmt3,2,i * )。 } sqlite3_finalize(stmt3)。 } if (sqlite3_step(stmt4) != SQLITE_DONE) { sqlite3_finalize(stmt4)。stmt5,NULL) != SQLITE_OK) { if (stmt5) sqlite3_finalize(stmt5)。 } //輸出結果如下: //Succeed to create test table now. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //Insert Succeed. //The test table has been dropped.數(shù)據(jù)查詢是每個關系型數(shù)據(jù)庫都會提供的最基本功能,下面的代碼示例將給出如何通過SQLite API獲取數(shù)據(jù)。 2). 插入一條測試數(shù)據(jù)到該數(shù)據(jù)表以便于后面的查詢。 4). 刪除測試表。 sqlite3_stmt* stmt = NULL。對于DDL和DML語句而言,sqlite3_step執(zhí)行正確的返回值 //只有SQLITE_DONE,對于SELECT查詢而言,如果有數(shù)據(jù)返回SQLITE_ROW,當?shù)竭_結果集末尾時則返回 //SQLITE_DONE。 sqlite3_stmt* stmt2 = NULL。 } if (sqlite3_step(stmt2) != SQLITE_DONE) { sqlite3_finalize(stmt2)。 if (sqlite3_prepare_v2(conn,selectSQL,strlen(selectSQL),amp。 ++i) { //這里需要先判斷當前記錄當前字段的類型,再根據(jù)返回的類型使用不同的API函數(shù) //獲取實際的數(shù)據(jù)值。 } else if (vtype == SQLITE_NULL) { printf(This value is NULL.\n)。 sqlite3_finalize(stmt3)。 } if (sqlite3_step(stmt4) == SQLITE_DONE) { printf(The test table has been dropped.\n)。should be used as a reference guide. This article is intended as introduction only and is neither a plete nor authoritative reference for the SQLite API. Core Objects And InterfacesThe principal task of an SQL database engine is to evaluate statements of SQL. In order to acplish this purpose, the developer needs to know about two objects:object is not required since the convenience wrapper interfaces,and sqlite3_close()The six C/C++ interface routines and tw。objects are controlled by a small set of C/C++ interface routine listed below.ordatabase connection sqlite3_close(conn)。 const char* dropSQL = DROP TABLE TESTTABLE。 break。 if (vtype == SQLITE_INTEGER) { int v = sqlite3_column_int(stmt3,i)。 sqlite3_close(conn)。 return。this is a test.39。 sqlite3_close(conn)。 //2. 準備創(chuàng)建數(shù)據(jù)表,如果創(chuàng)建失敗,需要用sqlite3_finalize釋放sqlite3_stmt對象,以防止內存泄露。 void doTest() { sqlite3* conn = NULL。 return。 return。 const char* mitSQL = COMMIT。 if (sqlite3_step(stmt3) != SQLITE_DONE) { sqlite3_finalize(stmt3)。 } int insertCount = 10。 } sqlite3_finalize(stmt2)。 const char* beginSQL = BEGIN TRANSACTION。 if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt)。 int len = strlen(createTableSQL)。include include string include using namespace std。下面是示例代碼的實現(xiàn)步驟:3). 在完成所有的數(shù)據(jù)插入后顯式的提交事物。SQLite作為一種簡單靈活的嵌入式數(shù)據(jù)庫也同樣提供了該功能,但是實現(xiàn)方式并不像其他數(shù)據(jù)庫那樣方便明顯,它只是通過一種隱含的技巧來達到批量插入的目的,其邏輯如下: } if (sqlite3_step(stmt3) == SQLITE_DONE) { printf(The test table has been dropped.\n)。 } sqlite3_finalize(stmt2)。 if (sqlite3_prepare_v2(conn,sql,strlen(sql),amp。%s39。 sqlite3_close(conn)。 //2. 準備創(chuàng)建數(shù)據(jù)表,如果創(chuàng)建失敗,需要用sqlite3_finalize釋放sqlite3_stmt對象,以防止內存泄露。 void doTest() { sqlite3* conn = NULL。一旦獲得待定鎖,并繼續(xù)持有該鎖,阻止其他連接獲取待定鎖。因此,SQLit