【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";
}
相关推荐
Ai 编码助手5 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
Mr.Q5 小时前
Qt多边形填充/不填充绘制
qt
陈燚_重生之又为程序员6 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle6 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻6 小时前
MySQL排序查询
数据库·mysql
萧鼎6 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^6 小时前
数据库连接池的创建
java·开发语言·数据库
荒川之神6 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师6 小时前
Oracle 23AI创建示例库
数据库·oracle
Wx-bishekaifayuan6 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava