C++操作SQLite簡明教程。本站提示廣大學習愛好者:(C++操作SQLite簡明教程)文章只能為提供參考,不一定能成為您想要的結果。以下是C++操作SQLite簡明教程正文
SQLite是一款輕型的當地文件數據庫,是遵照ACID的聯系關系式數據庫治理體系。它的設計目的是嵌入式的,並且今朝曾經在許多嵌入式產物中應用了它,它的功效強、速度快,它占用資本異常的低,在嵌入式裝備中,能夠只須要幾百K的內存就夠了。它可以或許支撐Windows/Linux/Unix等主流的操作體系,同時可以或許跟許多法式說話相聯合。
1、SQLite的數據類型
在停止數據庫操作之前,有個成績須要解釋,就是SQLite的數據類型,和其他的數據庫分歧,Sqlite支撐的數據類型有他本身的特點:Typelessness(無類型)。 SQLite是無類型的,這意味著你可以保留任何類型的數據到你所想要保留的任何表的任何列中, 不管這列聲明的數據類型是甚麼。
而年夜多半的數據庫在數據類型上都有嚴厲的限制,在樹立表的時刻,每列都必需制訂一個數據類型,只要相符該數據類型的數據可以被保留在這一列傍邊。而在SQLite 2.X中,數據類型這個屬性只屬於數據本生,而和睦數據被存在哪一列有關,也就是說數據的類型其實不受數據列限制(有一個破例:INTEGER PRIMARY KEY,該列只能存整型數據)。
然則當SQLite進入到3.0版本的時刻,這個成績仿佛又有了新的謎底,SQLite的開辟者開端限制這類無類型的應用,在3.0版本傍邊,每列開端具有本身的類型,而且在數據存入該列的時刻,數據庫會試圖把數據的類型向該類型轉換,然後以轉換以後的類型存儲。固然,假如轉換被以為是弗成行的,SQLite依然會存儲這個數據,就像他的後任版本一樣。
舉個例子,假如你妄圖向一個INTEGER類型的列中拔出一個字符串,SQLite會檢討這個字符串能否有整型數據的特點, 假如有並且可以被數據庫所辨認,那末該字符串會被轉換成整型再保留,假如不可,則照樣作為字符串存儲。
固然SQLite許可疏忽數據類型, 然則依然建議在你的Create Table語句中指定命據類型. 由於數據類型關於你和其他的法式員交換, 或許你預備換失落你的數據庫引擎時能起到一個提醒或贊助的感化. SQLite支撐罕見的數據類型, 如:
1.NULL,值是NULL
2.INTEGER,值是有符號整形,依據值的年夜小以1,2,3,4,6或8字節寄存
3.REAL,值是浮點型值,以8字節IEEE浮點數寄存
4.TEXT,值是文本字符串,應用數據庫編碼(UTF-8,UTF-16BE或許UTF-16LE)
5.BLOB,只是一個數據塊,完整依照輸出寄存(即沒有准換)
SQLite的操作接口
SQLite的2個主要構造體:
sqlite3 *pdb,數據庫句柄,跟文件句柄FILE很相似
sqlite3_stmt *stmt,這個相當於ODBC的Command對象,用於保留編譯好的SQL語句
SQLite的5個重要的函數:
sqlite3_open(), 翻開數據庫
sqlite3_exec(),履行非查詢的sql語句
sqlite3_prepare(),預備sql語句,履行select語句或許要應用parameter bind時,用這個函數(封裝了sqlite3_exec).
sqlite3_step(),在挪用sqlite3_prepare後,應用這個函數在記載集中挪動。
sqlite3_close(),封閉數據庫文件
還有一系列的函數,用於從記載集字段中獲得數據,如:
sqlite3_column_text(),取text類型的數據
sqlite3_column_blob(),取blob類型的數據
sqlite3_column_int(),取int類型的數據
C++應用前預備
下載SQLite,分離從http://www.sqlite.org/2013/sqlite-amalgamation-3071700.zip、 http://www.sqlite.org/2013/sqlite-dll-win32-x86-3071700.zip下載SQLite的源文件和庫文件。
然則sqlite-dll-win32-x86-3071700.zip中並沒有供給SQLite的lib文件,須要本身編譯生成。解壓sqlite-dll-win32-x86-3071700.zip到sqlite-dll-win32-x86-3071700目次,再將VS裝置目次下VC中的LIB.EXE、LINK.EXE、mspdb80.dll(這裡用的是VS2008)拷貝到sqlite-dll-win32-x86-3071700,履行LIB.EXE /DEF:SQLITE3.DEF /MACHINE:IX86 便可以獲得SQLITE3.LIB文件。
C++拜訪SQLite
C++對SQLite停止操作的代碼以下:
#include "stdafx.h"
#include <string.h>
using namespace std;
#include "sqlite3.h"
#pragma comment(lib, "SQLITE3.LIB")
static int SelectCallback(void *notUsed, int argc, char **argv, char **azColName)
{
for (int i = 0 ; i < argc ; i++)
{
printf("%s = %s", azColName[i], (argv[i] ? argv[i] : "NULL"));
if (i != argc -1)
{
printf(", ");
}
}
printf("\n");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
sqlite3 * pDB;
char* errMsg;
// 翻開SQLite數據庫
int res = sqlite3_open("sql.db", &pDB);
if ( res != SQLITE_OK ){
printf("Can't open database: %s\n", sqlite3_errmsg(pDB));
sqlite3_close(pDB);
return -1;
}
// 創立表
string strSQL= "create table test (id int, name text);";
res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);
if (res != SQLITE_OK)
{
printf("Create table error: %s\n", errMsg);
//return -1;
}
// 拔出數據
res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);
for (int i= 1; i < 10; ++i)
{
char sql[512];
sprintf_s(sql, "insert into test values(%d, %s);", (i+10), "\"Test Name\"");
res = sqlite3_exec(pDB, sql,0,0, &errMsg);
if (res != SQLITE_OK)
{
printf("Insert error: %s\n", errMsg);
return -1;
}
}
res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);
// 查詢數據
strSQL= "select * from test;";
res = sqlite3_exec(pDB, strSQL.c_str(), SelectCallback, 0 , &errMsg);
if (res != SQLITE_OK)
{
printf("Select error: %s\n", errMsg);
return -1;
}
// 封閉數據庫
sqlite3_close(pDB);
return 0;
}