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的響應函數中。這樣我們就可以做出帶有界面的資料庫操作程式。這僅是一些簡單的操作,要想做出一些有價值的東西,還需要更深的努力。