最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++操作SQLite簡(jiǎn)明教程

 更新時(shí)間:2014年06月12日 10:59:17   投稿:junjie  
這篇文章主要介紹了C++操作SQLite簡(jiǎn)明教程,包含創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)等常用操作,需要的朋友可以參考下

SQLite是一款輕型的本地文件數(shù)據(jù)庫,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng)。它的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它的功能強(qiáng)、速度快,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語言相結(jié)合。

一、SQLite的數(shù)據(jù)類型

在進(jìn)行數(shù)據(jù)庫操作之前,有個(gè)問題需要說明,就是SQLite的數(shù)據(jù)類型,和其他的數(shù)據(jù)庫不同,Sqlite支持的數(shù)據(jù)類型有他自己的特色:Typelessness(無類型)。 SQLite是無類型的,這意味著你可以保存任何類型的數(shù)據(jù)到你所想要保存的任何表的任何列中, 無論這列聲明的數(shù)據(jù)類型是什么。

而大多數(shù)的數(shù)據(jù)庫在數(shù)據(jù)類型上都有嚴(yán)格的限制,在建立表的時(shí)候,每一列都必須制定一個(gè)數(shù)據(jù)類型,只有符合該數(shù)據(jù)類型的數(shù)據(jù)可以被保存在這一列當(dāng)中。而在SQLite 2.X中,數(shù)據(jù)類型這個(gè)屬性只屬于數(shù)據(jù)本生,而不和數(shù)據(jù)被存在哪一列有關(guān),也就是說數(shù)據(jù)的類型并不受數(shù)據(jù)列限制(有一個(gè)例外:INTEGER PRIMARY KEY,該列只能存整型數(shù)據(jù))。

但是當(dāng)SQLite進(jìn)入到3.0版本的時(shí)候,這個(gè)問題似乎又有了新的答案,SQLite的開發(fā)者開始限制這種無類型的使用,在3.0版本當(dāng)中,每一列開始擁有自己的類型,并且在數(shù)據(jù)存入該列的時(shí)候,數(shù)據(jù)庫會(huì)試圖把數(shù)據(jù)的類型向該類型轉(zhuǎn)換,然后以轉(zhuǎn)換之后的類型存儲(chǔ)。當(dāng)然,如果轉(zhuǎn)換被認(rèn)為是不可行的,SQLite仍然會(huì)存儲(chǔ)這個(gè)數(shù)據(jù),就像他的前任版本一樣。

舉個(gè)例子,如果你企圖向一個(gè)INTEGER類型的列中插入一個(gè)字符串,SQLite會(huì)檢查這個(gè)字符串是否有整型數(shù)據(jù)的特征, 如果有而且可以被數(shù)據(jù)庫所識(shí)別,那么該字符串會(huì)被轉(zhuǎn)換成整型再保存,如果不行,則還是作為字符串存儲(chǔ)。
誠(chéng)然SQLite允許忽略數(shù)據(jù)類型, 但是仍然建議在你的Create Table語句中指定數(shù)據(jù)類型. 因?yàn)閿?shù)據(jù)類型對(duì)于你和其他的程序員交流, 或者你準(zhǔn)備換掉你的數(shù)據(jù)庫引擎時(shí)能起到一個(gè)提示或幫助的作用. SQLite支持常見的數(shù)據(jù)類型, 如:

1.NULL,值是NULL
2.INTEGER,值是有符號(hào)整形,根據(jù)值的大小以1,2,3,4,6或8字節(jié)存放
3.REAL,值是浮點(diǎn)型值,以8字節(jié)IEEE浮點(diǎn)數(shù)存放
4.TEXT,值是文本字符串,使用數(shù)據(jù)庫編碼(UTF-8,UTF-16BE或者UTF-16LE)
5.BLOB,只是一個(gè)數(shù)據(jù)塊,完全按照輸入存放(即沒有準(zhǔn)換)

SQLite的操作接口

SQLite的2個(gè)重要結(jié)構(gòu)體:

sqlite3 *pdb,數(shù)據(jù)庫句柄,跟文件句柄FILE很類似
sqlite3_stmt *stmt,這個(gè)相當(dāng)于ODBC的Command對(duì)象,用于保存編譯好的SQL語句

SQLite的5個(gè)主要的函數(shù):

sqlite3_open(), 打開數(shù)據(jù)庫
sqlite3_exec(),執(zhí)行非查詢的sql語句
sqlite3_prepare(),準(zhǔn)備sql語句,執(zhí)行select語句或者要使用parameter bind時(shí),用這個(gè)函數(shù)(封裝了sqlite3_exec).
sqlite3_step(),在調(diào)用sqlite3_prepare后,使用這個(gè)函數(shù)在記錄集中移動(dòng)。
sqlite3_close(),關(guān)閉數(shù)據(jù)庫文件

還有一系列的函數(shù),用于從記錄集字段中獲取數(shù)據(jù),如:

sqlite3_column_text(),取text類型的數(shù)據(jù)
sqlite3_column_blob(),取blob類型的數(shù)據(jù)
sqlite3_column_int(),取int類型的數(shù)據(jù)

C++使用前準(zhǔn)備

下載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,執(zhí)行LIB.EXE /DEF:SQLITE3.DEF /MACHINE:IX86 就可以得到SQLITE3.LIB文件。

C++訪問SQLite

C++對(duì)SQLite進(jìn)行操作的代碼如下:

復(fù)制代碼 代碼如下:

#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數(shù)據(jù)庫
 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;
 }

// 創(chuàng)建表
 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;
 }

// 插入數(shù)據(jù)
 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);

// 查詢數(shù)據(jù)
 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;
 }

 // 關(guān)閉數(shù)據(jù)庫
 sqlite3_close(pDB);

return 0;
}

相關(guān)文章

  • C++中多線程間共享數(shù)據(jù)詳解

    C++中多線程間共享數(shù)據(jù)詳解

    這篇文章主要為大家詳細(xì)介紹了C++中多線程間共享數(shù)據(jù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語言實(shí)現(xiàn)三子棋實(shí)例代碼

    C語言實(shí)現(xiàn)三子棋實(shí)例代碼

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)三子棋實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無重復(fù)字符的子串)

    C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無重復(fù)字符的子串)

    這篇文章主要介紹了C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無重復(fù)字符的子串),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)例講解選擇語句的使用

    C語言實(shí)例講解選擇語句的使用

    選擇語句是C語言中的重要組成部分,該部分也比較基礎(chǔ),本文將通過最通俗易懂的方式來為大家做出講解。相信通過本文的學(xué)習(xí),讓大家一舉拿下C語言選擇語句的知識(shí)點(diǎn)
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(70.爬樓梯問題)

    C++實(shí)現(xiàn)LeetCode(70.爬樓梯問題)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(70.爬樓梯問題),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 解決c++?error:crosses?initialization?of?問題

    解決c++?error:crosses?initialization?of?問題

    最近在寫代碼的時(shí)候,碰到了?crosses?initialization?of?...?的問題,只因我在?switch?的某個(gè)?case?分支下定義了一個(gè)變量,于是乎便將這個(gè)問題整理一下,需要的朋友可以參考下
    2023-03-03
  • C++?OpenCV實(shí)現(xiàn)boxfilter方框?yàn)V波的方法詳解

    C++?OpenCV實(shí)現(xiàn)boxfilter方框?yàn)V波的方法詳解

    box?filter的作用很簡(jiǎn)單,即對(duì)局部區(qū)域求平均,并把值賦給某個(gè)點(diǎn),一般我們賦給區(qū)域中心。本文將用C++實(shí)現(xiàn)boxfilter方框?yàn)V波,需要的可以了解一下
    2022-10-10
  • C++ Boost Exception超詳細(xì)講解

    C++ Boost Exception超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • 詳解C++泛型裝飾器

    詳解C++泛型裝飾器

    這篇文章主要為大家介紹了C++的泛型裝飾器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C/C++實(shí)現(xiàn)圖形學(xué)掃描線填充算法

    C/C++實(shí)現(xiàn)圖形學(xué)掃描線填充算法

    這篇文章主要介紹了C/C++實(shí)現(xiàn)圖形學(xué)掃描線填充算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論

吉首市| 牙克石市| 镇远县| 高台县| 汤原县| 宜城市| 陇川县| 忻城县| 安阳县| 伊金霍洛旗| 土默特左旗| 孟津县| 旌德县| 大宁县| 台东县| 无为县| 安岳县| 隆德县| 柘城县| 双柏县| 历史| 兴安县| 大名县| 于都县| 绿春县| 香河县| 云霄县| 富源县| 冀州市| 辽源市| 兴和县| 辛集市| 临夏县| 奇台县| 瑞丽市| 常宁市| 大新县| 建瓯市| 甘孜| 米易县| 昌邑市|