SQLite數據庫是零配置的,sqlite數據庫不同於SqlServer等數據庫,SQLite不需要復雜配置,只需要,將SQLite的庫文件和動態鏈接文件拷貝到相應工程目錄下,就可以使用SQLite數據庫,只是用到數據庫基本操作的同學們,建議選擇SQLite數據庫,為大家介紹一下使用SQLite數據庫API函數來實現一些基本操作。
Sqlite應用與嵌入式,應為小巧方便,而且沒有其他數據庫的復雜配置,我們在寫一些小程序或者對數據庫不是很復雜的操作的情況下,sqlite是不錯的選擇 。
我們使用sqlite時需要下下載它的壓縮包,網上有很多,
解壓后,我們可以看到存在 其中我們需要的sqlite3.h和sqlite3.lib以及sqlite3.dll三個文件,接下來我們需要配置我們的編譯器(vc6.0或者VS,其步驟都一樣)
(1)首先,打開VS編譯器,新建WIN32 控制台程序,F7編譯,運行(當然什么都沒有,目的是得到debug文件)
(2)然后我們把已經下載的SQLite3.h,SQLite3.lib拷貝到新建的TestSqlite目錄下。然后把sqlite3.h拷貝到debug目錄下。其實只要把這幾個文件拷貝到程序的目錄下即可,到時候我們可以在include中加上路徑,同樣也能找到。
上面這種加載庫文件的方法,有一定弊端(萬一我們要引用的文件很多,都拷貝到程序目錄下,會很麻煩),第二種方法是使用VS2010編譯器所帶的功能:我們點擊“項目”->“屬性”-> 鏈接器,在附加包含目錄里面添加我們所用到的庫文件(lib)(輸入頭文件或者包含文件所在的文件目錄),然后在附加庫目錄里面添加我們用到的庫文件的名字(庫文件所在的文件目錄)。注意添加的時候用逗號隔開(此時我們仍然要把動態鏈接文件拷貝到程序目錄下),這樣我們就完成了庫文件的加載。方法如下:
(3)
(4)附加包含目錄
(5)附加依賴項
以上使用第三方庫的方法請看如何使用第三方庫 http://blog.csdn.net/u014028070/article/details/42278007
以上方法相當與我們把庫文件包含進來,以便調用。然后我們在主程序的頭文件中加入如下頭文件(sqlite的API函數所在的頭文件)。然后我們編譯下,檢查前面的操作是否正確。
此時我們在程序中使用sqliteAPI函數來操作數據庫。首先是創建數據庫,此時,我們定義一個sqlite操作句柄(以后的打開,插入,執行等動作都是由句柄來執行的),然后定義一個字符指針,和數組,指針用來傳遞錯誤信息,數組用來存放我們的sql語句。如圖:
sqlite3_open()函數用來打開一個數據庫,若存在,則直接打開,若不存在,則建立一個。
運行一下。
此時我們進入程序的目錄下,會發現多了一個后綴名為db的文件,這就是我們創建的數據庫,右鍵屬性,看到大小為0kb(因為里面沒有插入數據)。
此時,我們進行插入數據操作,插入操作首先要建立數據所屬的屬性(關系數據庫的概念),我們在數據庫中增加三個屬性,分別是sno,sname,sex。分別是整形,動態字符型,字符型。
<span style="font-size:18px;"> sqlite3 * conn = NULL; char * err_msg = NULL; char sql[200] = "" ; // 打開數據庫, 創建連接 if(sqlite3_open("student.db", &conn) != SQLITE_OK) { cout<<"無法打開!"; } //創建表 student 創建表以后 不能重復創建 sprintf(sql, "CREATE TABLE student_for_table \ (sno int, sname varchar(20), age int)"); if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { cout<<"操作失敗,錯誤代碼: %s"<< err_msg; exit(-1); } </span>
然后我們執行插入操作。(這里只是一個插入數據的演示)
<span style="font-size:18px;">int main(int argc, _TCHAR* argv[]) { sqlite3 * conn = NULL; char * err_msg = NULL; char sql[200] = "" ; // 打開數據庫, 創建連接 if(sqlite3_open("student.db", &conn) != SQLITE_OK) { cout<<"無法打開!"; } //創建表 student 創建表以后 不能重復創建 sprintf(sql, "CREATE TABLE student_for_table \ (sno int, sname varchar(20), age int)"); if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { cout<<"操作失敗,錯誤代碼: %s"<< err_msg; exit(-1); } //表創建完成,插入數據 for (int i = 0; i < 10; i++) { // 執行SQL sprintf(sql, "INSERT INTO student_for_table \ (sno, sname, age) VALUES \ (%d, '%s', %d)", i, "students", i); if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { cout<<"操作失敗,錯誤代碼: %s"<< err_msg; exit(-1); } }</span>
<span style="font-size:18px;">}</span>
然后執行,我們進入程序目錄,然后可以看出來數據庫的大小已經不是空了。
插入數據后,當然我們需要讀出來然后顯示,所以添加如下代碼。
//把數據讀出來,進行顯示,sqlite3_exec()執行,調用回調函數,顯示的操作寫在回填函數中
<span style="font-size:18px;"> sprintf(sql, "SELECT * FROM student_for_table"); sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg); </span>
要讀出數據,我們要定義一個回調函數:
<span style="font-size:18px;">//為了數據讀出來,使用回調函數 int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames) { for (int i = 0; i < 3; i++) { printf("%s\t", colValues[i]); } printf("\n"); return 0; }</span>
以上最后的程序如下:
<span style="font-size:18px;">// TestSqlite.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include<iostream> #include"sqlite3.h" using namespace std; #pragma comment(lib,"sqlite3.lib") //為了數據讀出來,使用回調函數 int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames) { for (int i = 0; i < 3; i++) { printf("%s\t", colValues[i]); } printf("\n"); return 0; } int main(int argc, _TCHAR* argv[]) { sqlite3 * conn = NULL; char * err_msg = NULL; char sql[200] = "" ; // 打開數據庫, 創建連接 if(sqlite3_open("student.db", &conn) != SQLITE_OK) { cout<<"無法打開!"; } //創建表 student 創建表以后 不能重復創建 sprintf(sql, "CREATE TABLE student_for_table \ (sno int, sname varchar(20), age int)"); if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { cout<<"操作失敗,錯誤代碼: %s"<< err_msg; exit(-1); } //表創建完成,插入數據 for (int i = 0; i < 10; i++) { // 執行SQL sprintf(sql, "INSERT INTO student_for_table \ (sno, sname, age) VALUES \ (%d, '%s', %d)", i, "students", i); if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { cout<<"操作失敗,錯誤代碼: %s"<< err_msg; exit(-1); } } //把數據讀出來,進行顯示,sqlite3_exec()執行,調用回調函數,顯示的操作寫在回填函數中 sprintf(sql, "SELECT * FROM student_for_table"); sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg); //操作完數據庫后,一定要 關閉連接。 if (sqlite3_close(conn) != SQLITE_OK) { cout<<"無法關閉,錯誤代碼: %s\n"<< sqlite3_errmsg(conn)<<endl;; exit(-1); } cout<<"操作成功"<<endl; return 0; } </span>
運行結果如下:
上面演示的是C++如何與sqlite連接,同時我們也可以將mfc與sqlite聯合起來使用,做出帶界面的操作,其核心的思想是一致的,只是把對sqlite數據庫的操作放在不同的響應函數中(mfc以消息傳遞),比如我們把“打開數據庫”操作放在一個button的響應函數中。這樣我們就可以做出帶有界面的數據庫操作程序。這僅是一些簡單的操作,要想做出一些有價值的東西,還需要更深的努力。