Qt实战案例(25)(序)——利用QSQL相关类实现对SQLite数据库的增删改查操作的详细介绍

上文Qt实战案例(25)——利用QSQL相关类实现对SQLite数据库的增删改查操作介绍了利用SQLite数据库的基本操作和利用QSQL对数据库进行增删改查的基本操作,本文再次基础上对其进行更加详细的介绍。

目录

    • 一、项目介绍
    • 二、项目基本配置
    • 三、UI界面设计
    • 四、主程序实现
      • 4.1 pro文件
      • 4.2 main.cpp文件
        • 1.建立数据库
        • 2.打开数据库
        • 3.关闭数据库
        • 4.操作数据库
          • 例1:创建表格
          • 例2:插入数据
          • 例3:修改数据
          • 例4:查询数据
          • 例5:删除与清空
    • 五、效果演示

一、项目介绍

利用Qt对SQLite数据库完成数据的增、删、改、查等操作。

二、项目基本配置

新建一个Qt案例,项目名称为“SQLiteTest”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。

三、UI界面设计

无UI界面

四、主程序实现

4.1 pro文件

在SQLiteTest.pro文件中添加如下代码:

QT+=sql

4.2 main.cpp文件

1.建立数据库

检查连接、添加数据库驱动、设置数据库名称、数据库登录用户名、密码:

QSqlDatabase database;
if (QSqlDatabase::contains("qt_sql_default_connection"))
{
    database = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
    database = QSqlDatabase::addDatabase("QSQLITE");//创建SQLite数据库
    db.setHostName ("SQLite-001") ;//设置数据库主机名
    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()返回这个连接;如果这个连接不存在,则进入else分支,需要创建连接,并添加数据库。
  3. 在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”))

  1. else分支第二行中,setDatabaseName()的参数是数据库文件名。如果这个数据库不存在,则会在后续操作时自动创建;如果已经存在,则后续的操作会在已有的数据库上进行。
  2. else分支后面两行,设置用户名和密码。用户名,密码都可以随便取,也可以省略。

2.打开数据库

使用open()打开数据库,并判断是否成功。注意,在第一步检查连接是否存在时,如果连接存在,则在返回这个连接的时候,会默认将数据库打开。

if (!database.open())
{
    qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
    // do something
}

如果打开成功,则进入else分支。对数据库的操作都需要在else分支中进行。

3.关闭数据库

数据库操作完成后,最好关闭:

database.close();

4.操作数据库

对数据库进行操作需要用到QSqlQuery类,操作前必须定义一个对象。

例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)");

创建表格语句(SQL):

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();
}
else
{
    qDebug() << "inserted Wang!";
}
if(!sql_query.exec("INSERT INTO student VALUES(3, \"Li\", 23)"))
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "inserted Li!";
}

插入语句(SQL):

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!";
}

修改数据语句(SQL):

update <table_name> set <f1=value1>, <f2=value2>… where <expression>;

更新(修改)的语句是update…set…,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。
bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。

例4:查询数据

查询部分数据:

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);
    }
}

查询语句(SQL):

select <f1>, <f2>, ... from <table_name>;

select是查询指令; 等等是要查询的变量(即表头),中间用逗号隔开;from …指定表格。
上述语句是说查询student表中的 id 和 name 。执行查询之后,用sql_query.value(int)来获得数据。同样地,value(0)表示第一个数据,即 id,value(1)表示name。注意:value()函数的返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。

查询全部数据:

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);
    }
}

查询语句(SQL):

select * from <table_name>;

查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。

查询最大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();
}
else
{
    while(sql_query.next())
    {
        max_id = sql_query.value(0).toInt();
        qDebug() << QString("max id:%1").arg(max_id);
    }
}

这个就是在语句中用max来获取最大值。

例5:删除与清空

删除一条数据:

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!";
}

删除语句(SQL):

delete from <table_name> where <f1> = <value>

delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。

清空表格(删除所有):

QString clear_sql = "delete from student";
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "table cleared";
}

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

五、效果演示


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

你可能感兴趣的:(Qt,qt,c++,sql,database)