【Qt】数据库(一)SQLITE创建、增删查改

填坑1:如何连续插入
汇总SQlite语句

创建表格:create table <table_name> (f1 type1, f2 type2,...);

增:insert into <table_name> values (value1, value2,...);

改:update <table_name> set <f1=value1>, <f2=value2>... where ;

查:select , , ... from <table_name>;

删:delete from <table_name> where =

删全部:delete from <table_name>

Step1:准备工作

创建项目

在qmake中(.pro文件)引入依赖:QT += sql

引入头文件

cpp 复制代码
#include <QSqlDatabase>   //创建数据库
#include <QSqlError>
#include <QSqlQuery>      //针对数据库进行一些操作
#include <QMessageBox>    //提示弹窗,这个可以不加

Step2:创建(配置)和关闭

2.1 创建(打开)数据库

在类中创建一个bool型的函数,创建并配置一个数据库

cpp 复制代码
bool MainWindow::createConnection()//创建并配置数据库
{
    //建立了一个QSqlDatabase对象,后续的操作要使用这个对象
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");//Sqlite数据库
    database.setHostName("127.0.0.1");//连接地址
    database.setDatabaseName("MyDataBase_sqlite.db");//命名数据库
    database.setUserName("ShengQiang");//用户名
    database.setPassword("123456");//密码

    if (!database.open()) {//如果数据库连接失败,则弹出
        QMessageBox::critical(0, "Cannot open database",
                              "Unable to establish a database connection", QMessageBox::Cancel);
        return false;
    }
    else{//如果数据库连接成功,则弹出
        QMessageBox::information(0, "Succeed", "Good Luck!",QMessageBox::Ok);
    }
    return true;
}

通常我们需要不断判断数据库是否已创建,而不是一直创建一个数据库,所以我们可以通过if判断数据库是否已经创建了。

2.2 关闭数据库

数据库操作完成后,最好关闭。下次用到了再重新打开。

cpp 复制代码
database.close();//database是自己创建的数据库变量

Step3:操作(增删查改)

3.1 创建表格

创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。

cpp 复制代码
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()函数的参数中,例如:

cpp 复制代码
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 TABLE;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是id,这一列储存的数据类型是int,第二列名称是name,数据类型是字符数组,最多有30个字符(和char(30)的区别在于,varchar的实际长度是变化的,而char的长度始终是给定的值),第三列的名称是age,数据类型是int。

如果sql_query.exec()执行成功,则创建表格成功。

3.2 增

在刚才创建的表格中,插入一行数据。

cpp 复制代码
    database.open();
    QSqlQuery sql_query;
    //在插入数据时,不需要手动指定id字段的值,因为SQLite会为您自动生成。您只需要绑定其他字段的值
    QString insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)";
    sql_query.prepare(insert_sql);
    //sql_query.addBindValue(10);
    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(9, \"Li\", 23)"))
//    {
//        qDebug() << sql_query.lastError();
//    }
//    else
//    {
//        qDebug() << "inserted Li!";
//    }
    //    database.close();

插入语句:insert into <table_name> values (value1, value2,...);

insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候,则是直接写出完整语句。

3.3 改

例3:更新数据(修改数据)
cpp 复制代码
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 <f1=value1>, <f2=value2>... where ;

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

bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。

3.4 查

3.4.1 查部分数据

cpp 复制代码
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 , , ... from <table_name>;

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

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

3.4.2 查全部数据

cpp 复制代码
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.4.3 查询最大id

cpp 复制代码
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);
        }
}

3.5 删

3.5.1 删除一条数据

cpp 复制代码
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 =

delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。
3.5.2 清空表格(删除所有)

cpp 复制代码
QString clear_sql = "delete from student";
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "table cleared";
}
相关推荐
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天1 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
mahuifa2 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨3 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存