在Qt中使用SQLite数据库

  • 格式:pdf
  • 大小:114.71 KB
  • 文档页数:4

在Qt中使⽤SQLite数据库

前⾔

SQLite(sql)是⼀款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,⾮常适合嵌⼊式系统。

Qt5以上版本可以直接使⽤SQLite(Qt⾃带驱动)。

⽤法

1 准备

1. 引⼊SQL模块

在Qt项⽬⽂件(.pro⽂件)中,加⼊SQL模块:

QT += sql

2. 引⽤头⽂件

在需要使⽤SQL的类定义中,引⽤相关头⽂件。例如:

#include

#include

#include

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 student (id int primary key, name varchar(30), age int)");

创建表格语句:create table (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();

}

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 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 set , … where ;

更新(修改)的语句是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()<

}

else

{

while(sql_query.next())

{

int id = sql_query.value(0).toInt();

QString name = sql_query.value(1).toString();

qDebug()<

}

}

语句select , , ... from ;

select是查询指令; 等等是要查询的变量(即表头),中间⽤逗号隔开;from ...指定表格。

上述语句是说查询student表中的 id 和 name 。执⾏查询之后,⽤sql_query.value(int)来获得数据。同样地,value(0)表⽰第⼀个数据,即

id,value(1)表⽰name。注意:value()函数的返回值类型是QVariant,因此要⽤toInt()等函数转换成特定的类型。

(2)查询全部数据

QString select_all_sql = "select * from student";

sql_query.prepare(select_all_sql);

if(!sql_query.exec())

{

qDebug()<

}

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()<

}

}

语句select * from ;

查询所有数据⽤ * 表⽰。⽤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);

if(!sql_query.exec())

{

qDebug() << sql_query.lastError();