在Qt中使用SQLite数据库

在Qt中使用SQLite数据库,第1张

概述原文链接:http://www.cnblogs.com/xia-weiwen/archive/2017/05/04/6806709.html 前言 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。 Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 用法 1 准备 引入SQL模块 在Qt项目文件(.pro文件)中,加入SQL模 原文链接:http://www.cnblogs.com/xia-weiwen/archive/2017/05/04/6806709.HTML
前言

sqlite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。
Qt5以上版本可以直接使用sqlite(Qt自带驱动)。

用法 1 准备

引入sql模块
在Qt项目文件(.pro文件)中,加入sql模块:

QT += sql

引用头文件
在需要使用sql的类定义中,引用相关头文件。例如:

#include <QsqlDatabase>#include <QsqlError>#include <Qsqlquery>
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对象,后续的 *** 作要使用这个对象。
(2)if语句用来检查指定的连接(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"))
(4)else分支第二行中,setDatabasename()的参数是数据库文件名。如果这个数据库不存在,则会在后续 *** 作时自动创建;如果已经存在,则后续的 *** 作会在已有的数据库上进行。
(5)else分支后面两行,设置用户名和密码。用户名,密码都可以随便取,也可以省略。

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 <table_name> (f1 type1,f2 type2,…);
create table是创建表格的语句,也可用大写CREATE table;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是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_ID+1);sql_query.addBindValue("Wang");sql_query.addBindValue(25);if(!sql_query.exec()){    qDeBUG() << sql_query.lastError();}"inserted Wang!";}if(!sql_query.exec("INSERT INTO student VALUES(3,\"li,23)")){    qDeBUG() << sql_query.lastError();}"inserted li!";}

插入语句:insert into <table_name> values (value1,value2,245)!important">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",21)">"Qt");sql_query.bindValue(":ID",1);"updated!";}

语句:update <table_name> set <f1=value1>,<f2=value2>… 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是查询指令;

QString select_all_sql = "select * from student";sql_query.prepare(select_all_sql);if(!sql_query.exec()){    qDeBUG()<<sql_query.lastError();}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)查询最大ID

QString select_max_sql = "select max(ID) from student";int max_ID = 0;sql_query.prepare(select_max_sql);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);else{    qDeBUG()<<"deleted!";}

delete from <table_name> where <f1> = <value>
delete用于删除条目,用where给出限定条件。例如此处是删除 ID = 0的条目。
(2)清空表格(删除所有)

QString clear_sql = "delete from student";sql_query.prepare(clear_sql);"table cleared";}

这里没有用where给出限制,就会删除所有内容。

总结

以上是内存溢出为你收集整理的在Qt中使用SQLite数据库全部内容,希望文章能够帮你解决在Qt中使用SQLite数据库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存