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方法可以取得结果行某列的具体值。

猜你喜欢

转载自www.cnblogs.com/dianrain/p/9285703.html