登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

SQLite简单使用(C++)  

2011-06-18 11:43:03|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
SQLite简单使用(C++) - 秒大刀 - 秒大刀的城堡

     SQLite是遵守ACID关系数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp创建的公有领域项目。

    不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。    

 

应用Demo:

    从官网下载SQLite amalgamation版源码,并将其中的sqlite3.h和sqlite3.c引入新建的C++ Win32 Console Application。

SQLite简单使用 - 秒大刀 - 秒大刀的城堡

    此时编译会产生C1853报错,原因是sqlite3.c混用了stdafx.cpp产生的预编译头文件

SQLite简单使用 - 秒大刀 - 秒大刀的城堡

    打开sqlite3.c的属性页面,并设置“不使用预编译头”,如此可以顺利编译通过。

SQLite简单使用(C++) - 秒大刀 - 秒大刀的城堡

    添加如下的测试代码:

bool test(sqlite3* db)

{

         sqlite3_stmt* stmt = NULL; 

         if(sqlite3_prepare_v2(db,

                   "create table if not exists files("

                   "id int primary key not null, "

                   "name string unique not null, "

                   "size int not null, "

                   "data blob not null)",

                   512, &stmt, NULL) != SQLITE_OK)

                   return false;

         if(sqlite3_step(stmt) != SQLITE_DONE)

                   return false;

         if(sqlite3_finalize(stmt) != SQLITE_OK)

                   return false;

 

         if(sqlite3_prepare_v2(db,

                   "insert into files values(last_insert_rowid() + 1, ?, 0, ?)",

                   512, &stmt, NULL) != SQLITE_OK)

                   return false;

         if(sqlite3_reset(stmt) != SQLITE_OK)

                   return false;

         if(sqlite3_bind_text(stmt, 1, "http://dearymz.blog.163.com", -1, NULL) != SQLITE_OK)

                   return false;

         if(sqlite3_bind_text(stmt, 2, "http://dearymz.blog.163.com", -1, NULL) != SQLITE_OK)

                   return false;

         if(sqlite3_step(stmt) != SQLITE_DONE)

                   return false;

         if(sqlite3_finalize(stmt) != SQLITE_OK)

                   return false;

        

         if(sqlite3_prepare_v2(db,

                   "select count(*) from files",

                   512, &stmt, NULL) != SQLITE_OK)

                   return false;

         if(sqlite3_step(stmt) != SQLITE_ROW)

                   return false;

         cout << sqlite3_column_int(stmt, 0) << endl;

         if(sqlite3_finalize(stmt) != SQLITE_OK)

                   return false;

         return true;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

         sqlite3* db = NULL;

         if(sqlite3_open("test.db3", &db) == 0)

         {

                   if(test(db))

                            cout << "OK" << endl;

                   else

                            cout << "Error!" << endl;

         }

         cout << sqlite3_errmsg(db) << endl;

         sqlite3_close(db);

 

         system("pause");

         return 0;

} 

    成功执行后会在项目目录内生成一个test.db3文件,通过SQLiteSpy工具打开后可看到刚才插入的数据: 

SQLite简单使用(C++) - 秒大刀 - 秒大刀的城堡

 
SQLite API简介:
     其中sqlite3_open自然是打开一个SQLite数据库(当该数据库不存在时会自动创建一个空库),相应的sqlite3_close是关闭数据库。
    sqlite3_stmt可以认为是对象级别的SQL语句。对于频繁使用的SQL,可通过sqlite3_prepare_v2方法将其加工成stmt可以获得性能提升。stmt用完后需要调用相应的sqlite3_finalize方法来释放底层数据库资源。
    SQLite支持有参数的SQL语句,支持?、?123、:name、@name、$name等多种参数写法。支持一系列的sqlite3_bind_TYPE方法来进行参数绑定。
    可以通过sqlite3_step方法来执行一个准备好的stmt语句。成功执行时:对于无返回值的语句返回SQLITE_DONE;对于有返回值的语句返回SQLITE_ROW,可通过迭代sqlite3_step方法来访问结果的每一行。sqlite3_column_TYPE方法可以取得结果行某列的具体值。

 

[注:本文对应的SQLite版本为3.7.6.3]

 
参考:
SQLite官网:http://sqlite.org/
开放源码嵌入式数据库 SQLite 简介:http://www.ibm.com/developerworks/cn/opensource/os-sqlite/
SQLite的应用情形:http://www.sqlite.org/whentouse.html
 
推荐阅读:

2011-6-23
    SQLite官方源码不支持加密解密,数据库文件中的数据以全明文的形式存在。不过作者显然仔细考虑过这个问题,留下了实现加密的接口。
    我认为作者不引入加密解密功能是明智的,否则随随便便SQLite就变成SQLarge了。把关键的事情做好,就必须舍弃掉某些“需求”。赞同作者的设计抉择,犀利睿智!
 
SQLite Database Encryption/Decryption:http://sqlite-crypt.com/
  评论这张
 
阅读(10147)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018