欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > qt SQLite学习记录

qt SQLite学习记录

2024/10/24 18:28:38 来源:https://blog.csdn.net/qq_71286244/article/details/140589563  浏览:    关键词:qt SQLite学习记录

1. 查看qt中数据库的驱动的类型的支持

QStringList drivers = QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型foreach(QString driver,drivers){qDebug()<<driver;}

在这里插入图片描述

2. Qt SQL 模块包含的主要类的功能介绍

Qt SQL 模块包含了一些主要的类,用于在 Qt 应用程序中实现数据库操作。以下是几个主要类的功能介绍:

  1. QSqlDatabase:用于表示数据库连接的类。通过 QSqlDatabase 类,可以建立和管理数据库连接,并执行数据库操作。

  2. QSqlQuery:用于执行 SQL 查询的类。通过 QSqlQuery 类,可以执行各种 SQL 查询语句,如 SELECT、INSERT、UPDATE、DELETE 等,并获取查询结果。

  3. QSqlTableModel:用于绑定数据库表格的类。通过 QSqlTableModel 类,可以将数据库表格和 Qt 的模型/视图框架相结合,实现数据的展示和编辑。

  4. QSqlRelationalTableModel:用于处理关系型数据库表格的类。通过 QSqlRelationalTableModel 类,可以处理包含外键关系的数据库表格,并在 UI 中显示相关联的数据。

  5. QSqlQueryModel:用于执行 SQL 查询并在视图中显示结果的类。通过 QSqlQueryModel 类,可以执行 SQL 查询并将结果集显示在 Qt 的视图组件中,如 QTableView、QListView 等。

  6. QSqlRelationalDelegate:用于管理数据库表格中外键列的类。通过 QSqlRelationalDelegate 类,可以为外键列提供自定义的展示和编辑行为。

  7. QSqlError:表示数据库错误信息的类。通过 QSqlError 类,可以获取数据库操作时可能发生的错误信息,便于进行错误处理和调试。

总的来说,Qt SQL 模块提供了一系列的类和方法,方便开发者在 Qt 应用程序中实现数据库操作和数据展示功能。

3. QSqlDatabase操作主要接口

方法描述
addDatabase(const QString &type)添加一个数据库连接,并指定数据库类型。
removeDatabase(const QString &name)移除指定名称的数据库连接。
database(const QString &connectionName = defaultConnection)返回指定名称的数据库连接。
contains(const QString &connectionName)检查是否存在指定名称的数据库连接。
setDatabaseName(const QString &name)设置连接的数据库名称。
setUserName(const QString &name)设置连接的用户名。
setPassword(const QString &password)设置连接的密码。
open()打开数据库连接。
isOpen()检查数据库连接是否打开。
close()关闭数据库连接。
tables(QSql::TableType type = Tables)返回数据库中的表格列表。
exec(const QString &query)执行 SQL 查询语句。
commit()提交数据库事务。
rollback()回滚数据库事务。
lastError()返回最后一个数据库操作的错误信息。
  • 范例示范
QSqlDatabase db;//对于一个工程而言,该类对象就相当于是一个数据库,所以再工程中只使用一个对象即可
//连接成功,返回一个数据库对象db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库db.setDatabaseName("test.db");//数据库文件后缀为.db//如果想要进一步操作数据库,那么,就必须要进行数据库打开操作if(!db.open()){qDebug()<<"Error falied to open"<<db.lastError();}

4. QSqlQuery 操作主要接口

方法描述
bindValue(int pos, const QVariant &val)绑定参数到查询中的指定位置。
boundValue(int pos)返回查询中指定位置的绑定参数值。
exec()执行当前设置的查询。
exec(const QString &query)执行指定的 SQL 查询语句。
setForwardOnly(bool forward)设置查询是否只能向前滚动。
first()移动到查询结果的第一条记录。
last()移动到查询结果的最后一条记录。
next()移动到查询结果的下一条记录。
previous()移动到查询结果的上一条记录。
seek(int index, bool relative)移动到查询结果中的指定位置。
value(int index)返回当前记录中指定字段的值。
record()返回当前记录的字段值。
nextResult()移动到多结果查询的下一个结果。
finish()完成多结果查询。
isActive()检查查询是否处于活动状态。
isValid()检查查询是否有效。
isSelect()检查查询是否为 SELECT 查询。
isForwardOnly()检查查询是否只能向前滚动。
lastError()返回最后一个查询操作的错误信息。
  • 范例示范
//连接成功,返回一个数据库对象db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库db.setDatabaseName("test.db");//数据库文件后缀为.db//如果想要进一步操作数据库,那么,就必须要进行数据库打开操作if(!db.open()){qDebug()<<"Error falied to open"<<db.lastError();}//访问数据库的主要操作包括:创建表  向数据库表中插入数据  删除数据  更新数据  查询数据//对于数据库中的表,通常只需要创建一次,其他的操作可以重复QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联//定义一条创建表的sql语句   表名:staff  表中的字段: id name ageQString sqlCreate = QString("create table staff(id integer primary key autoincrement,""name varchar(20),""age int;");query.exec(sqlCreate);

5. 插入查询操作

  • 创建表
//连接成功,返回一个数据库对象db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库db.setDatabaseName("test.db");//数据库文件后缀为.db//如果想要进一步操作数据库,那么,就必须要进行数据库打开操作if(!db.open()){qDebug()<<"Error falied to open"<<db.lastError();}//访问数据库的主要操作包括:创建表  向数据库表中插入数据  删除数据  更新数据  查询数据//对于数据库中的表,通常只需要创建一次,其他的操作可以重复//QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联
#if 0//定义一条创建表的sql语句   表名:staff  表中的字段: id name ageQString sqlCreate = QString("create table staff(id integer primary key autoincrement,""name varchar(20),""age int);");if(!query.exec(sqlCreate)){qDebug()<<"create table error"<<db.lastError();}
#endifQSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联
  • 插入操作
    //插入操作QString sqlInsert = QString ("INSERT INTO staff(id ,name,age) VALUES(2,'张三',20);");if(!query.exec(sqlInsert)){qDebug()<<"insert data error"<<db.lastError();}
  • 查询操作
    QString sqlSelect =QString ("select *from staff;");if(!query.exec(sqlSelect)){qDebug()<<"select data error"<<db.lastError();}else{while(query.next()){qDebug()<< query.value("id").toInt();qDebug()<< query.value("name").toString();qDebug()<< query.value("age").toInt();}}

6. 删除更新操作

  • 删除操作
//删除操作QSqlQuery query;QString sqlDelete = QString("delete from staff where id = 2;");if(!query.exec(sqlDelete)){qDebug()<<"delete data error"<<db.lastError();}
  • 更新操作
//更新数据操作QSqlQuery query;QString sqlUpdate = QString("update staff set name = '李四' where id =1;");if(!query.exec(sqlUpdate)){qDebug()<<"update data error"<<db.lastError();}

7.数据库和图形界面交互项目

  • 项目效果展示
    在这里插入图片描述
  • 增删改查功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QListWidgetItem>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1.根据数据库的类型来连接数据库db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("compary.db");//2.打开数据库if(!db.open()){qDebug()<<"open error"<<db.lastError();}//3.根据需求,创建数据库中所需要的表QSqlQuery query;/*员工表:staff字段名有 id name age adress salary*///autoincrement 自动增长//注释掉,这个创建表的操作只需要操作一次
#if 0QString sqlCreateTable = QString("create table staff(id integer primary key autoincrement,""name varchar(20),""age int,""address varchar(50),""salary int);");if(!query.exec(sqlCreateTable)){qDebug()<<"create table"<<db.lastError();}#endif#if 0QString sqlInsert = QString("insert into staff(name,age,address,salary) ""values('张三',20,'广州市天河区',12000);");if(!query.exec(sqlInsert)){qDebug()<<"Error insert into data"<<db.lastError();}#endif}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_add_clicked()
{//1.获取UI控件的内容//int id=ui->lineEdit_ID->text().toUInt();QString name=ui->lineEdit_name->text();QString address=ui->lineEdit_adress->text();int age=ui->lineEdit_age->text().toInt();int salary = ui->lineEdit_money->text().toInt();//2.执行sql语句将数据插入到数据中QSqlQuery query;QString sqlInsert=QString("insert into staff(name,age,address,salary)""values('%1',%2,'%3',%4);").arg(name).arg(age).arg(address).arg(salary);if(!query.exec(sqlInsert)){qDebug()<<"Error insert into data"<<db.lastError();}else{qDebug()<<"insert successful!!!";}}void MainWindow::on_pushButton_update_clicked()
{//更新数据库QSqlQuery query;int id=ui->lineEdit_ID->text().toInt();QString address=ui->lineEdit_adress->text();QString sqlUpdate=QString("update staff set address = '%1' where id=%2; " ).arg(address).arg(id);if(!query.exec(sqlUpdate)){qDebug()<<"Error update into data"<<db.lastError();}else{qDebug()<<"update staff successful!!!";}
}void MainWindow::on_pushButton_delete_clicked()
{//设置通过名字来删除QSqlQuery query;int id=ui->lineEdit_ID->text().toInt();QString sqlDelete=QString("delete from staff where id = %1;").arg(id);if(!query.exec(sqlDelete)){qDebug()<<"Error delete into data"<<db.lastError();}else{qDebug()<<"delete successful!!!";}//2.删除数据库的同时要删除UI控件上的内容,下标是从零开始的ui->listWidget->takeItem(id-1);}void MainWindow::on_pushButton_check_clicked()
{ui->listWidget->clear();//查询数据库的操作QSqlQuery query;//1.向数据库下达查询数据的命令QString sqlSelect=QString("select*from staff ;");if(!query.exec(sqlSelect)){qDebug()<<"Error select into data"<<db.lastError();}//2.遍历数据库的记录while(query.next()){int id = query.value("id").toInt();QString name = query.value("name").toString();int age = query.value("age").toInt();QString address = query.value("address").toString();QString salary = query.value("salary").toString();qDebug()<<"id = "<<id<<"name = "<<name<<"age = "<<age<<"address = "<<address<<"salary = "<<salary;//3. 没遍历一条记录,就更新到ui控件上//3.1创建一个列表条目itemFrom*staffitem=new itemFrom();staffitem->setId(id);staffitem->setName(name);staffitem->setAge(age);staffitem->setAddress(address);staffitem->setSalary(salary);QListWidgetItem*item=new QListWidgetItem();//将大小设置相同item->setSizeHint(QSize(574,51));ui->listWidget->addItem(item);//QWidget(staffitem)放置在QListWidget中的一个项(item)中,而不是直接替换掉项。ui->listWidget->setItemWidget(item,staffitem);}}
  • 自定义控件
    在这里插入图片描述
#include "itemfrom.h"
#include "ui_itemfrom.h"itemFrom::itemFrom(QWidget *parent) :QMainWindow(parent),ui(new Ui::itemFrom)
{ui->setupUi(this);
}itemFrom::~itemFrom()
{delete ui;
}void itemFrom::setId(int id)
{ui->lineEdit_ID->setText(QString::number(id));
}void itemFrom::setName(QString name)
{ui->lineEdit_name->setText(name);
}void itemFrom::setAge(int age)
{ui->lineEdit_age->setText(QString::number(age));
}void itemFrom::setAddress(QString address)
{ui->lineEdit_address->setText(address);
}void itemFrom::setSalary(QString salary)
{ui->lineEdit_money->setText(salary);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com