SQL模块概述
QSqlTableModel的使用
可读可写
BLOB(binary large object),二进制大对象,是一个可以存储二进制文件的容器
//如果需要自定义代理,则需要自己写一个继承自QStyledItemDelegate的类
//QT += sql
#include <QtSql>
#include <QDataWidgetMapper>
//打开数据库
QSqlDatabase DB=QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
DB.setDatabaseName(DBFile); //设置数据库名称
DB.open();
QSqlTableModel *tabModel=new QSqlTableModel(this,DB);//数据模型
tabModel->setTable("employee"); //设置数据表
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//数据保存方式
tabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder); //排序
tabModel->setHeaderData(tabModel->fieldIndex("empNo"),Qt::Horizontal,"工号");//只是设置表头为工号
//创建界面组件与数据模型的字段之间的数据映射
QDataWidgetMapper* dataMapper=new QDataWidgetMapper(); //数据映射
dataMapper->setModel(tabModel);//设置数据模型
dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
//界面组件与tabModel的具体字段之间的联系
dataMapper->addMapping(ui->dbSpinEmpNo,tabModel->fieldIndex("empNo"));
//获取所有字段名称
QSqlRecord emptyRec=tabModel->record();//获取空记录,只有字段名
QSqlRecord curRec=tabModel->record(curRecNo); //获取当前记录
QByteArray data=curRec.value("Photo").toByteArray();
QPixmap pic;
pic.loadFromData(data);
tabModel->insertRow(tabModel->rowCount(),QModelIndex()); //在末尾添加一个记录
QModelIndex curIndex=tabModel->index(tabModel->rowCount()-1,0);//创建最后一行的ModelIndex
tabModel->setData(tabModel->index(currow,2),"男");
// 插入行时设置缺省值,需要在primeInsert()信号里去处理
//插入记录
QModelIndex curIndex=ui->tableView->currentIndex();
tabModel->insertRow(curIndex.row(),QModelIndex());
tabModel->revertAll();//取消修改
bool res=tabModel->submitAll();//保存修改
tabModel->isDirty();有未保存修改时可用
//删除当前记录
QModelIndex curIndex=theSelection->currentIndex();//获取当前选择单元格的模型索引
tabModel->removeRow(curIndex.row()); //删除最后一行
tabModel->setSort(ui->comboFields->currentIndex(),Qt::AscendingOrder);//升序
tabModel->setFilter(" Gender='男' ");
QSqlQueryModel的使用
只能读,不能写
#include <QtSql>
#include <QDataWidgetMapper>
QSqlDatabase DB=QSqlDatabase::addDatabase("QSQLITE");//数据库
DB.setDatabaseName(aFile); //设置数据库名称
DB.open();
QSqlQueryModel *qryModel=new QSqlQueryModel(this); //数据模型
qryModel->setQuery("SELECT * FROM employee ORDER BY empNo");
qryModel->lastError().isValid();//出错
ui->tableView->setModel(qryModel);
QSqlQuery的使用
QSqlQuery query; //查询当前empNo的Memo和Photo字段的数据
query.prepare("select EmpNo, Memo, Photo from employee where EmpNo = :ID");
query.bindValue(":ID",empNo);//将empNo值付给:ID 变量绑定
query.exec();
query.first();
QVariant va=query.value("Photo");
qryModel->query().exec();//数据模型重新查询数据,更新tableView显示
QString sqlStr=qryModel->query().executedQuery();//执行过的SELECT语句
qryModel->setQuery(sqlStr);//重新查询数据
QSqlRelationalTableModel
QSqlRelationalTableModel *tabModel=new QSqlRelationalTableModel(this,DB);//数据模型
//设置代码字段的查询关系数据表
tabModel->setRelation(3,QSqlRelation("departments","departID","department")); //设置第3列的关联数据 p1:关联哪个表 p2:外键 p3:显示关联表中的那个列