1. 查看qt中数据库的驱动的类型的支持
QStringList drivers = QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型
foreach(QString driver,drivers)
{
qDebug()<<driver;
}
2. Qt SQL 模块包含的主要类的功能介绍
Qt SQL 模块包含了一些主要的类,用于在 Qt 应用程序中实现数据库操作。以下是几个主要类的功能介绍:
-
QSqlDatabase
:用于表示数据库连接的类。通过 QSqlDatabase 类,可以建立和管理数据库连接,并执行数据库操作。 -
QSqlQuery
:用于执行 SQL 查询的类。通过 QSqlQuery 类,可以执行各种 SQL 查询语句,如 SELECT、INSERT、UPDATE、DELETE 等,并获取查询结果。 -
QSqlTableModel
:用于绑定数据库表格的类。通过 QSqlTableModel 类,可以将数据库表格和 Qt 的模型/视图框架相结合,实现数据的展示和编辑。 -
QSqlRelationalTableModel
:用于处理关系型数据库表格的类。通过 QSqlRelationalTableModel 类,可以处理包含外键关系的数据库表格,并在 UI 中显示相关联的数据。 -
QSqlQueryModel
:用于执行 SQL 查询并在视图中显示结果的类。通过 QSqlQueryModel 类,可以执行 SQL 查询并将结果集显示在 Qt 的视图组件中,如 QTableView、QListView 等。 -
QSqlRelationalDelegate
:用于管理数据库表格中外键列的类。通过 QSqlRelationalDelegate 类,可以为外键列提供自定义的展示和编辑行为。 -
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 age
QString 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 age
QString 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();
}
#endif
QSqlQuery 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 0
QString 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 0
QString 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);
}