天天看點

sqlite與C++進行連接配接

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檔案)

sqlite與C++進行連接配接

(2)然後我們把已經下載下傳的SQLite3.h,SQLite3.lib拷貝到建立的TestSqlite目錄下。然後把sqlite3.h拷貝到debug目錄下。其實隻要把這幾個檔案拷貝到程式的目錄下即可,到時候我們可以在include中加上路徑,同樣也能找到。

上面這種加載庫檔案的方法,有一定弊端(萬一我們要引用的檔案很多,都拷貝到程式目錄下,會很麻煩),第二種方法是使用VS2010編譯器所帶的功能:我們點選“項目”->“屬性”-> 連結器,在附加包含目錄裡面添加我們所用到的庫檔案(lib)(輸入頭檔案或者包含檔案所在的檔案目錄),然後在附加庫目錄裡面添加我們用到的庫檔案的名字(庫檔案所在的檔案目錄)。注意添加的時候用逗号隔開(此時我們仍然要把動态連結檔案拷貝到程式目錄下),這樣我們就完成了庫檔案的加載。方法如下:

(3)

sqlite與C++進行連接配接

(4)附加包含目錄

sqlite與C++進行連接配接

(5)附加依賴項

sqlite與C++進行連接配接

以上使用第三方庫的方法請看如何使用第三方庫    http://blog.csdn.net/u014028070/article/details/42278007

  以上方法相當與我們把庫檔案包含進來,以便調用。然後我們在主程式的頭檔案中加入如下頭檔案(sqlite的API函數所在的頭檔案)。然後我們編譯下,檢查前面的操作是否正确。

此時我們在程式中使用sqliteAPI函數來操作資料庫。首先是建立資料庫,此時,我們定義一個sqlite操作句柄(以後的打開,插入,執行等動作都是由句柄來執行的),然後定義一個字元指針,和數組,指針用來傳遞錯誤資訊,數組用來存放我們的sql語句。如圖:

sqlite與C++進行連接配接

sqlite3_open()函數用來打開一個資料庫,若存在,則直接打開,若不存在,則建立一個。

sqlite與C++進行連接配接

運作一下。

此時我們進入程式的目錄下,會發現多了一個字尾名為db的檔案,這就是我們建立的資料庫,右鍵屬性,看到大小為0kb(因為裡面沒有插入資料)。

sqlite與C++進行連接配接

此時,我們進行插入資料操作,插入操作首先要建立資料所屬的屬性(關系資料庫的概念),我們在資料庫中增加三個屬性,分别是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>
           

然後執行,我們進入程式目錄,然後可以看出來資料庫的大小已經不是空了。

sqlite與C++進行連接配接

插入資料後,當然我們需要讀出來然後顯示,是以添加如下代碼。

 //把資料讀出來,進行顯示,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>
           

運作結果如下:

sqlite與C++進行連接配接

上面示範的是C++如何與sqlite連接配接,同時我們也可以将mfc與sqlite聯合起來使用,做出帶界面的操作,其核心的思想是一緻的,隻是把對sqlite資料庫的操作放在不同的響應函數中(mfc以消息傳遞),比如我們把“打開資料庫”操作放在一個button的響應函數中。這樣我們就可以做出帶有界面的資料庫操作程式。這僅是一些簡單的操作,要想做出一些有價值的東西,還需要更深的努力。

繼續閱讀