SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,SQLite引擎不是个程序与之通讯的独立进程,而是连接到程序中成为它的一个主要部分,其主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有着积极的作用。
1.Qt操作SQLite数据库Qt提供了与平台以及数据库种类无关的访问数据库接口,支持类型和描述分别有:Driver Type DescriptionQDB2 IBM DB2QIBASE Borland InterBase DriverQMYSQL MySQL DriverQOCI Oracle Call Interface DriverQODBC ODBC Driver (includes Microsoft SQL Server)QPSQL PostgreSQL DriverQSQLITE SQLite version 3 or aboveQSQLITE2 SQLite version 2QTDS Sybase Adaptive Server
涉及操作注意点:
<1>.创建Qt项目,数据库放置与工程同一个目录下,添加头文件【include <QtSql>】,Qt工程文件(xxx.pro)添加涉及库【QT +=sql】;<2>.SQLite数据库主要操作QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //声明数据库类型db.setDatabaseName("demo.db"); //关联数据库db.open(); //连接打开数据库【只有通过open激活到数据库的物理连接,否则不可用】QSqlQuery sqlQuery(db); //数据库操作sqlQuery.exec("select * from 数据表"); //通过exec执行sql相关操作db.close(); //用完,关闭数据库
<3>.简单例子
#include#include #include int main(int argc,char *argv[]){ QApplication app(argc,argv); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName((char *)"demo.db"); //db.setUserName("用户名"); //db.setPassword("密码"); if(!db.open()) { //连接数据库失败 return -1; } QSqlQuery sqlQuery; //插入数据 sqlQuery.prepare("insert into employee(id, name, salary) values(:id, :name, :salary)"); bool bInsert = sqlQuery.exec("insert into employee(id, name, salary) values(1001, '张三', 6500)"; //sqlQuery.bindValue(":id", 1001); //sqlQuery.bindValue(":name", "张三"); //sqlQuery.bindValue(":salary", "6500"); //bool bInsert = sqlQuery.exec(); if (!bInsert) { //插入数据失败 } //查询数据 sqlQuery.exec("select * from employee"); while (sqlQuery.next()) { int id = sqlQuery.value(0).toInt(); QString name = sqlQuery.value(1).toString(); QString salary = sqlQuery.value(2).toString(); //获取相关数据处理 } //更新数据 sqlQuery.exec("update employee set salary= \"7000\" where id=\"1001\""); app.exec(); return 0;}
2.C/C++接口操作SQLite数据库
SQLite本身提供了对应的API函数接口供C/C++程序调用,主要有:sqlite3_open(),sqlite3_exec()和sqlite3_close()。<1>.核心对象SQLite中主要的核心对象分别为:database_connection和prepared_statementdatabase_connection对象是由sqlite3_open()接口函数创建并返回的,在应用程序使用任何其他SQLite接口函数之前,必须先调用该函数以便获得database_connnection对象,在随后的其他调用中,都需要该对象作为输入参数以完成相应的工作;prepare_statement可以把它视为编译后的SQL语句,作为涉及操作调用接口参数;<2>.核心接口
sqlite3_open是操作SQLite数据库的入口函数,该函数返回database_connection对象,作为句柄参数供其他接口调用;sqlite3_prepare将相关的SQL语句转换为prepared_statement对象,并在函数执行后返回对象指针,相当于一种操作初始化准备;
sqlite3_step用于评估sqlite3_prepare函数返回的prepared_statement对象,执行完将对象内部指针指向结果的数据行首,对于insert/update/delete等dml语句,该函数只需执行一次,其他需要访问其他数据行,需重复调用;
sqlite3_column获取当前行指定列的数据,由相关的接口完成该功能:
sqlite3_column_blobsqlite3_column_bytessqlite3_column_bytes16sqlite3_column_doublesqlite3_column_intsqlite3_column_int64sqlite3_column_textsqlite3_column_text16sqlite3_column_typesqlite3_column_valuesqlite3_column_count
其中sqlite3_column_count函数用于获取当前结果集中的字段数据;
sqlite3_finalize用于销毁prepared statement对象,避免内存泄露;
sqlite3_close用于关闭之前打开的database_connection对象;
<3>.简单例子
#include#include int main(){ int iRet; sqlite3 *db=NULL; iRet = sqlite3_open("demo.db", &db) if (SQLITE_OK != iRet) { //打开数据库失败 return -1; } char *ErrMsg; //sqlite3_exec:参数1(数据库指针)/参数2(sql语句)/参数3(回调函数)/参数4(回调函数参数)/参数5(返回错误信息) iRet = sqlite3_exec(db, "insert into employee(id, name, salary) values(1001,\"张三\",\"6500\")", NULL, NULL, &ErrMsg); if (SQLITE_OK != iRet) { //插入数据失败 } //int sqlite3_prepare( // sqlite3 *db, /* Database handle */ // const char *zSql, /* SQL statement, UTF-8 encoded */ // int nByte, /* Maximum length of zSql in bytes. */ // sqlite3_stmt **ppStmt, /* OUT: Statement handle */ // const char **pzTail /* OUT: Pointer to unused portion of zSql */ // ); sqlite3_stmt *ppStmt; iRet = sqlite3_prepare(db,"select id,name,salary from employee", -1, &ppStmt, NULL); if (SQLITE_OK != iRet) { //读取数据失败 } else { while(sqlite3_step(ppStmt) == SQLITE_ROW) { printf("id: %s\t", sqlite3_column_text(ppStmt, 0)); printf("name: %s\t", sqlite3_column_text(ppStmt, 1)); printf("salary: %s\n", sqlite3_column_text(ppStmt, 2)); } sqlite3_finalize(ppStmt); } sqlite3_close(db); return 0;}