QT关于数据库的相关概念
QT将数据库分为三个层次:
数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin
sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError
用户接口层:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel
实现数据库操作的相关方法
添加数据库:
[static] QSqlDatabase QSqlDatabase::addDatabase(
QSqlDriver *driver,
const QString &connectionName = QLatin1String(defaultConnection))
QSQLITE SQLite version 3 or above
设置数据库名称:
void QSqlDatabase::setDatabaseName(const QString &name)
包含数据库:
bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection))
打开数据库:
bool QSqlDriver::open(const QString &db)
关闭数据库:
void QSqlDatabase::close()
错误信息:
QSqlError QSqlDatabase::lastError()
sql语句执行:构造一个QSqlQuery类对象,调用其成员函数exec,执行sql语句
bool QSqlQuery::exec(const QString &query)
遍历查询结果的函数:
bool QSqlQuery::next()
通过数据库实现学生管理系统
功能界面:
主要功能代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//判断数据库对象是否包含了自己使用的数据库,例如Student.db
if(!db.contains("Student,db"))
{
//添加一个数据库
//函数原型:static QSqlDatabase addDatabase(const QString& type);
//参数:数据库版本
//返回值:添加的数据库
db = QSqlDatabase::addDatabase("QSQLITE"); //表示使用的是sqlite3版本的数据库
//给数据库命名
db.setDatabaseName("Student.db");
}
//打开数据库
if(!db.open())
{
QMessageBox::information(this, "提示", "数据库打开失败");
return;
}
//代码执行到这说明数据库创建并打开完毕,就可以创建数据表了
//创建数据表需要使用sql语句,需要使用QsqlQuery类对象来完成
//准备sql语句
QString sql = "create table if not exists myTable(" //创建表的sql语句
"id integer primary key autoincrement," //id主键,允许自增
"numb integer," //学号
"name varchar(10)," //姓名
"score integer," //分数
"sex varchar(4))"; //性别
//定义语句执行者
QSqlQuery query;
//使用query执行sql语句
if(!query.exec(sql))
{
QMessageBox::information(this, "失败", "创建表失败");
}else{
QMessageBox::information(this, "成功", "创建表成功");
}
}
Widget::~Widget()
{
delete ui;
}
//录入按钮对应的槽函数
void Widget::on_pushButton_clicked()
{
//获取ui界面中要存入数据库中的数据
int numb_ui = ui->lineEdit->text().toInt(); //获取UI界面的学号
QString name_ui = ui->lineEdit_2->text(); //获取UI界面的姓名
int score_ui = ui->lineEdit_3->text().toInt(); //获取UI界面的成绩
QString sex_ui = ui->lineEdit_4->text(); //获取UI界面的性别
if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0 || sex_ui.isEmpty())
{
QMessageBox::information(this, "提示", "请将信息填写完整");
return;
}
//准备sql语句
QString sql =QString("insert into myTable(numb, name, score, sex) values (%1, '%2', %3, '%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);
//定义语句执行者
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::information(this, "失败", "录入数据失败");
}else{
QMessageBox::information(this, "成功", "录入数据成功");
}
//清除
ui->lineEdit->clear();
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
}
//展示按钮对应的槽函数
void Widget::on_pushButton_2_clicked()
{
//准备sql语句
QString sql = "select * from myTable";
//定义语句执行者
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::information(this, "失败", "没有找到数据");
return;
}
//将查找到的所有结果都放到query对象中
//可以通过next函数不断遍历查询结果
int i = 0; //记录行号
while(query.next())
{
//遍历的是任意一组记录,query.record
//要找到每条记录中的每个数据,使用value(i)
//将数据库中的表格战术到UI界面
//ui->tableWidget->setItem()
//query.record().value()
for(int j=0; j<query.record().count()-1; j++)
{
ui->tableWidget->setItem(i, j, new QTableWidgetItem(query.record().value(j+1).toString()));
}
i++;
}
}