在Qt中使用SQLite数据库

在Qt中使用SQLite数据库 前言SQLitesql是一款开源轻量级的数据库软件不需要server可以集成在其他软件中非常适合嵌入式系统。Qt5以上版本可以直接使用SQLiteQt自带驱动。用法1 准备引入SQL模块在Qt项目文件(.pro文件)中加入SQL模块QT sqlMAKEFILE 复制 全屏引用头文件在需要使用SQL的类定义中引用相关头文件。例如#include QSqlDatabase #include QSqlError #include QSqlQueryCPP 复制 全屏2 使用1. 建立数据库检查连接、添加数据库驱动、设置数据库名称、数据库登录用户名、密码。QSqlDatabase database; if (QSqlDatabase::contains(qt_sql_default_connection)) { database QSqlDatabase::database(qt_sql_default_connection); } else { database QSqlDatabase::addDatabase(QSQLITE); database.setDatabaseName(MyDataBase.db); database.setUserName(XingYeZhiXia); database.setPassword(123456); }上述代码解释1第一行中建立了一个QSqlDatabase对象后续的操作要使用这个对象。2if语句用来检查指定的连接(connection)是否存在。这里指定的连接名称connection name是qt_sql_default_connection这是Qt默认连接名称。实际使用时这个名称可以任意取。如果判断此连接已经存在那么QSqlDatabase::contains()函数返回true。此时进入第一个分支QSqlDatabase::database()返回这个连接。3如果这个连接不存在则进入else分支需要创建连接并添加数据库。在else分支第一行addDatabase()的参数QSQLITE是SQLite对应的驱动名不能改。而且需要注意的是addDatabase()的第二个参数被省略了第二个参数的默认参数就是上面提到的Qt默认连接名称qt_sql_default_connection。如果需要使用自定义的连接名称如果程序需要处理多个数据库文件的话就会这样则应该加入第二个参数例如database QSqlDatabase::addDatabase(QSQLITE, my_sql_connection);这个时候如果在另一个地方需要判断my_sql_connection连接是否存在就应该使用if (QSqlDatabase::contains(my_sql_connection))。4else分支第二行中setDatabaseName()的参数是数据库文件名。如果这个数据库不存在则会在后续操作时自动创建如果已经存在则后续的操作会在已有的数据库上进行。5else分支后面两行设置用户名和密码。用户名密码都可以随便取也可以省略。2. 打开数据库使用open()打开数据库并判断是否成功。注意在第一步检查连接是否存在时如果连接存在则在返回这个连接的时候会默认将数据库打开。if (!database.open()) { qDebug() Error: Failed to connect database. database.lastError(); } else { // do something }如果打开成功则进入else分支。对数据库的操作都需要在else分支中进行。3. 关闭数据库数据库操作完成后最好关闭。database.close();4. 操作数据库对数据库进行操作需要用到QSqlQuery类操作前必须定义一个对象。下面举例说明操作方法。操作需要使用SQLite语句本文中的几个例子会使用几个常用的语句关于SQLite语句的具体信息请参考SQLite相关资料。例1创建表格创建一个名为student的表格表格包含三列第一列是id第二列是名字第三列是年龄。QSqlQuery sql_query; QString create_sql create table student (id int primary key, name varchar(30), age int); sql_query.prepare(create_sql); if(!sql_query.exec()) { qDebug() Error: Fail to create table. sql_query.lastError(); } else { qDebug() Table created!; }代码解释1第一行定义一个QSqlQuery对象。2第二行是一个QString其中的内容是SQLite语句。对数据库的操作都是用SQLite的语句完成的把这些指令以QString类型通过prepare函数保存在QSqlQuery对象中。也可将指令以QString形式直接写在exec()函数的参数中例如sql_query.exec(create table student (id int primary key, name varchar(30), age int));创建表格语句create table table_name (f1 type1, f2 type2,…);create table是创建表格的语句也可用大写CREATE TABLEstudent是表格的名称可以任意取括号中是表格的格式上述指令表明表格中有三列第一列的名称表头是id这一列储存的数据类型是int第二列名称是name数据类型是字符数组最多有30个字符和char(30)的区别在于varchar的实际长度是变化的而char的长度始终是给定的值第三列的名称是age数据类型是int。如果sql_query.exec()执行成功则创建表格成功。例2插入数据在刚才创建的表格中插入一行数据。QString insert_sql insert into student values (?, ?, ?); sql_query.prepare(insert_sql); sql_query.addBindValue(max_id1); sql_query.addBindValue(Wang); sql_query.addBindValue(25); if(!sql_query.exec()) { qDebug() sql_query.lastError(); } else { qDebug() inserted Wang!; } if(!sql_query.exec(INSERT INTO student VALUES(3, \Li\, 23))) { qDebug() sql_query.lastError(); } else { qDebug() inserted Li!; }插入语句insert into table_name values (value1, value2,…);insert into是插入语句student是表格名称values()是要插入的数据。这里我们插入了2组数据。插入第一组数据的时候用addBindValue来替代语句中的?替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候则是直接写出完整语句。例3更新数据修改数据QString update_sql update student set name :name where id :id; sql_query.prepare(update_sql); sql_query.bindValue(:name, Qt); sql_query.bindValue(:id, 1); if(!sql_query.exec()) { qDebug() sql_query.lastError(); } else { qDebug() updated!; }语句update table_name set f1value1, f2value2… where expression;更新修改的语句是update...set...其中student是表格名称name是表头名称即第二列:name是待定的变量where用于确定是哪一组数据:id也是待定变量。bindValue( , )函数用来把语句中的待定变量换成确定值。例4查询数据1查询部分数据QString select_sql select id, name from student; if(!sql_query.exec(select_sql)) { qDebug()sql_query.lastError(); } else { while(sql_query.next()) { int id sql_query.value(0).toInt(); QString name sql_query.value(1).toString(); qDebug()QString(id:%1 name:%2).arg(id).arg(name); } }语句select f1, f2, ... from table_name;select是查询指令f1等等是要查询的变量即表头中间用逗号隔开from ...指定表格。上述语句是说查询student表中的 id 和 name 。执行查询之后用sql_query.value(int)来获得数据。同样地value(0)表示第一个数据即 idvalue(1)表示name。注意value()函数的返回值类型是QVariant因此要用toInt()等函数转换成特定的类型。2查询全部数据QString select_all_sql select * from student; sql_query.prepare(select_all_sql); if(!sql_query.exec()) { qDebug()sql_query.lastError(); } else { while(sql_query.next()) { int id sql_query.value(0).toInt(); QString name sql_query.value(1).toString(); int age sql_query.value(2).toInt(); qDebug()QString(id:%1 name:%2 age:%3).arg(id).arg(name).arg(age); } }语句select * from table_name;查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。3查询最大idQString select_max_sql select max(id) from student; int max_id 0; sql_query.prepare(select_max_sql); if(!sql_query.exec()) { qDebug() sql_query.lastError(); } else { while(sql_query.next()) { max_id sql_query.value(0).toInt(); qDebug() QString(max id:%1).arg(max_id); } }这个就是在语句中用max来获取最大值。例5删除与清空1删除一条数据QString delete_sql delete from student where id ?; sql_query.prepare(delete_sql); sql_query.addBindValue(0); if(!sql_query.exec()) { qDebug()sql_query.lastError(); } else { qDebug()deleted!; }语句delete from table_name where f1 valuedelete用于删除条目用where给出限定条件。例如此处是删除 id 0的条目。2清空表格删除所有QString clear_sql delete from student; sql_query.prepare(clear_sql); if(!sql_query.exec()) { qDebug() sql_query.lastError(); } else { qDebug() table cleared; }这里没有用where给出限制就会删除所有内容。