嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。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.db SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite>2、创建表
sqlite> CREATE TABLE user(id int, name varchar(20));3、查看创建表的SQL语句
sqlite> .schema user CREATE 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|LiLei 2|HanMeimei6、删除
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
#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