C++操作SQLite3

来源:互联网 发布:淘宝小二介入规则 编辑:程序博客网 时间:2024/05/21 22:48
          SQLite 数据库,是一个非常轻量级自包含(lightweight and self-contained)的DBMS,它可移植性好,很容易使用,很小,高效而且可靠。SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。

          嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。QLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要占用内存,但其它开销很小,适合用于嵌入式设备,你需要做的仅仅是把它正确的编译到你的程序。

         SQLite命令,通过 D:\>sqlite3.exe -help 查看,如下表:

命令名命令说明.help列出所有内置命令。.backup DBNAME FILE备份指定的数据库到指定的文件,缺省为当前连接的main数据库。.databases列出当前连接中所有attached数据库名和文件名。.dump TABLENAME ...以SQL文本的格式DUMP当前连接的main数据库,如果指定了表名,则只是DUMP和表名匹配的数据表。参数TABLENAME支持LIKE表达式支持的通配符。.echo ON|OFF打开或关闭显示输出。.exit退出当前程序。.explain ON|OFF打开或关闭当前连接的SELECT输出到Human Readable形式。.header(s) ON|OFF在显示SELECT结果时,是否显示列的标题。.import FILE TABLE导入指定文件的数据到指定表。.indices TABLENAME显示所有索引的名字,如果指定表名,则仅仅显示匹配该表名的数据表的索引,参数TABLENAME支持LIKE表达式支持的通配符。.log FILE|off 打开或关闭日志功能,FILE可以为标准输出stdout,或标准错误输出stderr。.mode MODE TABLENAME设置输出模式,这里最为常用的模式是column模式,使SELECT输出列左对齐显示。.nullvalue STRING 使用指定的字符串代替NULL值的显示。.output FILENAME 将当前命令的所有输出重定向到指定的文件。.output stdout 将当前命令的所有输出重定向到标准输出(屏幕)。.quit 退出当前程序。 .read FILENAME 执行指定文件内的SQL语句。.restore DBNAME FILE 从指定的文件还原数据库,缺省为main数据库,此时也可以指定其它数据库名,被指定的数据库成为当前连接的attached数据库。.schema TABLENAME显示数据表的创建语句,如果指定表名,则仅仅显示匹配该表名的数据表创建语句,参数TABLENAME支持LIKE表达式支持的通配符。.separator STRING改变输出模式和.import的字段间分隔符。.show显示各种设置的当前值。.tables TABLENAME列出当前连接中main数据库的所有表名,如果指定表名,则仅仅显示匹配该表名的数据表名称,参数TABLENAME支持LIKE表达式支持的通配符。.width NUM1 NUM2 ...在MODE为column时,设置各个字段的宽度,注意:该命令的参数顺序表示字段输出的顺序。      

      常见操作:

      1、创建DB文件(存在的话则打开)

D:\>sqlite3.exe test.dbSQLite version 3.7.9 2011-11-01 00:52:41Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite>
      2、创建表

sqlite> CREATE TABLE user(id int, name varchar(20));
     3、查看创建表的SQL语句

sqlite> .schema userCREATE TABLE user(id int, name varchar(20));
      4、插入
sqlite> INSERT INTO user ('id', 'name') values(1, 'LiLei'); sqlite> INSERT INTO user ('id', 'name') values(2, 'HanMeimei');
      5、查询
sqlite> SELECT * from user;1|LiLei2|HanMeimei
      6、删除
sqlite> DELETE FROM user WHERE id=2;
      7、更新
sqlite> UPDATE user SET name='Xiaoming' WHERE id=1;
        

         一个C++封装的操作SQLite的实例:

头文件:

#ifndef  __INCLUDE_SQL_LITE_HELPER_H__#define  __INCLUDE_SQL_LITE_HELPER_H__#include "sqlite3.h"#pragma comment(lib, "sqlite3.lib")class SQLiteHelper{public:SQLiteHelper() { }virtual ~SQLiteHelper() { CloseDB(); }// 打开数据库int OpenDB(const char *path);// 关闭数据库int CloseDB();// 创建一张表int CreateTable(const char *create_table_state);// 删除一张表int DropTable(const char *table_name);// 查询操作int Select(const char *select_state);// 插入操作int Insert(const char *insert_state);// 删除操作int Delete(const char *delete_state);// 更新操作int Update(const char *update_state);private:sqlite3 *sqlite_db_;// 数据库的指针char* err_msg_;// 错误信息bool is_close_;// 关闭数据的标识// 主要用在selece操作中的显示数据元素static int CallBackFunc(void *NotUsed, int argc, char **argv, char **azColName);// 执行sql语句int SqlStateExec(const char *sql_state);};#endif

        实现cpp文件:

#include "iostream"using namespace std;#include "sql_lite_helper.h"int SQLiteHelper::OpenDB(const char *path){int res = sqlite3_open(path, &sqlite_db_);if(res){cout << "can't open database: " << sqlite3_errmsg(sqlite_db_);sqlite3_close(sqlite_db_);return -1;}is_close_ = false;return 0;}int SQLiteHelper::CloseDB(){if (!is_close_){int res = sqlite3_close(sqlite_db_);if(res){cout << "can't close database: " << sqlite3_errmsg(sqlite_db_);return -1;}}return 0;}int SQLiteHelper::CreateTable(const char *table_name_and_field){string create_table_state = "create table ";create_table_state += table_name_and_field;create_table_state += ";";int res = SqlStateExec(create_table_state.c_str());if (res != SQLITE_OK){ cout << "create table failed." << err_msg_ << endl;return -1;}else{cout << "create table successed." << endl;}return 0;}int SQLiteHelper::DropTable(const char *table_name){string sql_state = "drop table ";sql_state += table_name;sql_state += ";";int res = SqlStateExec(sql_state.c_str());if (res != SQLITE_OK){ cout << "drop table failed." << err_msg_ << endl;return -1;}else{cout << "drop table successed." << endl;}return 0;}int SQLiteHelper::Select(const char *select_state){int res = SqlStateExec(select_state);if (res != SQLITE_OK){cout << "select operate failed." << err_msg_ << endl;return -1;}else{cout << "select operate successed." << endl;}return 0;}int SQLiteHelper::Insert(const char *insert_state){int res = sqlite3_exec(sqlite_db_, "begin transaction;", CallBackFunc, 0, &err_msg_);res = SqlStateExec(insert_state);if (res != SQLITE_OK) {cout << "insert operate failed." << err_msg_ << endl;return -1;} res = sqlite3_exec(sqlite_db_, "commit transaction;", 0, 0, &err_msg_);cout << "insert operate successed." << endl;return 0;}int SQLiteHelper::Delete(const char *delete_state){int res = SqlStateExec(delete_state);if (res != SQLITE_OK){cout << "delete operate failed." << err_msg_ << endl;return -1;}else{cout << "delete operate successed." << endl;}return 0;}int SQLiteHelper::Update(const char *update_state){int res = SqlStateExec(update_state);if (res != SQLITE_OK){cout << "update operate failed." << err_msg_ << endl;return -1;}else{cout << "update operate successed." << endl;}return 0;}int SQLiteHelper::CallBackFunc(void *not_used, int element_count, char **element, char **col_name){for(int index = 0 ; index < element_count ; index++){cout << col_name[index] << " = " << (element[index] ? element[index] : "NULL") << ", ";}cout << "\n";return 0; }int SQLiteHelper::SqlStateExec(const char *sql_state){return sqlite3_exec(sqlite_db_, sql_state, CallBackFunc, 0, &err_msg_);}

       测试入口:

#include "stdafx.h"#include "iostream"#include "sstream"using namespace std; #include "sql_lite_helper.h"SQLiteHelper sql_lite_helper;// Test:创建一个数据库表int TestCreateTable(){return sql_lite_helper.CreateTable("test_table (id int, name varchar, age int)");}// Test:测试插入数据int TestInsert(){for (int i= 1; i < 10; ++i){std::stringstream str_sql;str_sql << "insert into test_table values(";str_sql << i << ","<< (i + 10) << "," << 23 << ");";std::string str = str_sql.str();sql_lite_helper.Insert(str.c_str());}return 0;}// Test:测试删除某个元素int TestDelete(){string str_sql= "delete from test_table where id=4;";return sql_lite_helper.Delete(str_sql.c_str());}// Test:测试更新某个元素int TestUpdate(){string str_sql= "update test_table set name='SQLite3' where name='17';";return sql_lite_helper.Update(str_sql.c_str());}// Test:测试查询int TestSelect(){string str_sql= "select * from test_table;";return sql_lite_helper.Select(str_sql.c_str());}// Test:测试删除表int TestDropTable(){return sql_lite_helper.DropTable("test_table");}int main(){int res = sql_lite_helper.OpenDB("./Test.db3");res = TestCreateTable();if (res != 0){return 0;}res = TestInsert();if (res != 0){return 0;}TestSelect();res = TestDelete();if (res != 0){return 0;}res = TestUpdate();if (res != 0){return 0;}TestSelect();TestDropTable();TestSelect();return 0;}

参考资料:

1、http://www.sqlite.org/index.html

2、C++操作SQLite数据库

3、c++操作sqllite



0 0
原创粉丝点击